如何使代码约定忽略特定的程序集引用?
我正在扩展Visual Studio。 在代码中我使用代码约定来进行断言和检查。 我将警告选项级别设置为高。
我想要做的是保持警告级别,同时忽略对EnvDTE引用进行的任何检查。
请考虑以下代码示例:
public static string GetAbsoluteOutputFolder(EnvDTE.Project project) { if (project == null) throw new ArgumentNullException("project"); var path = project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString(); //... }
使用我当前的设置,CC将要求我在分配path
变量之前添加以下检查:
Contract.Assume(project.ConfigurationManager != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);
因此,我想在这里做的是告诉CC“信任”EnvDTE并忽略这些类型及其属性。
我认为“对外部API持乐观态度”CC选项就是为了这个目的而服务的。 事实certificate它没有。
有没有办法让它按照我想要的方式运行, 不需要较低的警告级别 ?
编辑:我想要一个在项目级别工作的解决方案,并且仍然允许执行“常规”检查。
无法提供详细的解决方案,但这应该可以通过在程序集级别使用Baseline Feature或System.Diagnostics.CodeAnalysis.SuppressMessage来解决:
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", "Whatever")]
您可以使用SuppressMessageAttribute的“Target”属性仅忽略特定类型/方法/命名空间上的消息:
[SupressMessage("Microsoft.Contracts", "CC1055", Scope="Member", Target="YouNamespace.EnvDTE.Project"]
请注意,我使用的参数只是一个不错的选择,你必须自己找出正确的Scope,MessageId和Target :)在旁注中,我认为属性是条件(“CODE_ANALYSIS”)。
官方建议解决这个问题的方法是创建某种包装器,在你的情况下可能是一个创建或包含你的EnvDTE.Project对象的存储库。 然后,您可以在那里添加所需的Contract.Ensures。
我不认为解决这个问题是可能的,但是从C#6.0开始,有一种解决方法至少可以缓解疼痛:
代替
Contract.Assume(project.ConfigurationManager != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);
你现在可以写了
Contract.Assume(project.ConfigurationManager?.ActiveConfiguration?.Properties != null);
你有没有在程序集级别尝试过: [assembly: Contracts.ContractVerification(false)]
?
你应该能够动态地做到这一点: https : //msdn.microsoft.com/en-us/library/bb458043.aspx
希望这可以帮助,