我可以通过编译器选项传递VisualStudio Edition名称吗?

rka*_*ano 4 c# unit-testing compiler-options visual-studio vs-unit-testing-framework

我正在使用Microsoft.QualityTools.Testing.Fakes来模拟一些单元测试.

但此程序集仅适用于使用VisualStudio Ultimate的用户.

具有其他版本(专业版)的用户无法构建和运行此测试项目,并且在其环境中出现错误.

所以我创建了一个编译器指令来处理这个问题:

#define Ultimate

#if Ultimate
using Microsoft.QualityTools.Testing.Fakes;
#endif
Run Code Online (Sandbox Code Playgroud)

我的测试方法是:

#if Ultimate
    using (ShimsContext.Create())
    {
        ... My code
    }
#else
    Assert.Inconclusive("This test needs VS Ultimate to run");
#endif
Run Code Online (Sandbox Code Playgroud)

这很有效,但用户仍需要注释/取消注释定义行.

那么,有没有办法将我的VS版传递给编译器?或者还有另一种方法吗?

xan*_*tos 6

在文本编辑器中打开csproj,在最后一次<PropertyGroup>添加之后:

<PropertyGroup Condition=" $(VisualStudioEdition.Contains('Ultimate')) ">
  <DefineConstants>$(DefineConstants);ULTIMATE</DefineConstants>    
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,我已将所有常量写成大写,因此您必须将代码更改为:

#if ULTIMATE
Run Code Online (Sandbox Code Playgroud)

如果您希望自己面向未来,正如@Damian建议的那样:

<PropertyGroup Condition=" $(VisualStudioEdition.Contains('Ultimate')) Or $(VisualStudioEdition.Contains('Enterprise')) ">
  <DefineConstants>$(DefineConstants);ULTIMATE</DefineConstants>    
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

请注意,正如@Uwe所写,这些都是"黑客攻击"...手动编辑csproj是生活危险的生活:-)