如何在我无法控制的程序集中标记类型或成员已过时?

4
示例: 我的同事们不应再使用 Microsoft.VisualBasic.Collection 了,我希望构建过程能指向替代类型。这似乎是 ObsoleteAttribute 的一个案例,但是我无法在 Microsoft.VisualBasic.Collection 中设置属性。有没有一种方法可以实现这样的效果(针对项目的某些部分使框架类型或成员过时/禁用),而不需要使用丑陋的黑客技巧。
如果没有,请问有哪些黑客技巧?
更新:Visual Studio 2017 CE

3
请查看代码分析器:https://github.com/dotnet/roslyn/wiki/How-To-Write-a-C%23-Analyzer-and-Code-Fix - Christoph Fink
是的,我看过它们。但是这似乎是为了已经存在的东西(降低类型)而做很多工作。 - Nordic Mainframe
1
...但据我所知,这是在不通过黑客攻击框架程序集的情况下完成它的方法-您无法“外部添加属性”。 “包装器类型”只需添加属性也不会在您的情况下有所帮助,因为您的同事将不使用包装器类型。您应该能够使用上面链接中的大部分样板代码,并且仅实现“类型检查和警告”,这应该将工作量保持到最低限度。把它看作是一个很好的编程练习,以学习一些新东西;如果您实现了它,请与我们分享一个可行的解决方案。 - Christoph Fink
您还可以使用已取代 FxCop 的代码分析工具:https://learn.microsoft.com/en-gb/visualstudio/code-quality/code-analysis-for-managed-code-overview - Zhaph - Ben Duguid
我希望构建过程能够指向替代类型。- 这是一个绝对的要求吗?如果不是,我可以发布一个“hack”解决方案来使构建失败。 - TnTinMn
2个回答

1
对于在2023年及以后来到这个问题的人们,现在有一个适用于此的Roslyn分析器。
请参阅Microsoft.CodeAnalysis.BannedApiAnalyzers
您需要:
  1. 引用分析器包(使用Directory.Build.props或自定义的props文件可以在整个解决方案中全局使用);
    <ItemGroup>
        <PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="3.3.4">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
        </PackageReference>
    </ItemGroup>
    
  2. 创建一个新的BannedSymbols.txt文件,并将所有禁止使用的符号包含在其中;
  3. BannedSymbols.txt文件包含在与分析器相同的项目中;
    <ItemGroup>
        <AdditionalFiles Include="$(MSBuildThisFileDirectory)/BannedSymbols.txt" />
    </ItemGroup> 
    
例如,为了禁止Refit.RestService类型,你需要像这样写:T:Refit.RestService;不要使用它,这将导致你的IDE、dotnet CLI和CI都出现编译警告。

enter image description here


0
这不适用于ObsoleteAttribute——因为那意味着Microsoft打算删除这个类。
正如@ChrFin建议的那样,解决方案是使用分析器(又称为代码检查工具)来强制执行编码规范,而不是尝试篡改你没有拥有的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接