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

Can I pass VisualStudio Edition name through a compiler option?

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

但是这个程序集只对使用 VisualStudio Ultimate 的用户可用。

其他版本(Professional)的用户无法构建和运行这个测试项目,并且在他们的环境中给出错误。

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

#define Ultimate

#if Ultimate
using Microsoft.QualityTools.Testing.Fakes;
#endif

而我的测试方法是:

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

这很好用,但用户仍然需要 comment/uncomment 定义行。

那么,有没有办法将我的 VS 版本传递给编译器?或者有其他方法吗?

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

<PropertyGroup Condition=" $(VisualStudioEdition.Contains('Ultimate')) ">
  <DefineConstants>$(DefineConstants);ULTIMATE</DefineConstants>    
</PropertyGroup>

请注意,我将常量全部大写,因此您必须将代码更改为:

#if ULTIMATE

如果你想像@Damian 所建议的那样面向未来:

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

请注意,正如@Uwe 所写,这些是 "hacks"...手动编辑 csproj 是在冒险:-)

虽然@xanatos 的回答是您所要求的,但我将建议另一种方法。您不必将所有测试都放在同一个程序集中。

如果您将填充测试放在与正常测试不同的程序集中,那么您可以选择创建另一个解决方案(因此您有一个带有填充程序集的解决方案和一个没有填充程序集的解决方案),或者让团队成员使用较低版本的 Visual Studio 从他们的解决方案中卸载填充项目。

如果您要走卸载项目路线,那么卸载项目的选择将保存在解决方案的“.suo”文件中(您不应将其放入源代码管理中)。这意味着即使将新项目添加到解决方案中,卸载的项目也会继续卸载。

这是一个透明的问题解决方案(所以你不用担心团队以后忘记它是如何工作的),不需要手动编辑项目文件,也不需要你请记住将所有特定测试包装在 #if 中。它是否适合您的团队取决于您对解决方案和项目结构的总体方法。