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

本文关键字:Edition VisualStudio 可以通过 编译器 选项 | 更新日期: 2023-09-27 17:56:56

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

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

使用其他版本(专业版)的用户无法生成和运行此测试项目,并且这会在其环境中出错。

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

#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

这很好用,但用户仍然需要注释/取消注释定义行。

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

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

在文本编辑器中打开 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所写,这些是"黑客"......手动编辑CSPROJ过着冒险的生活:-)

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

如果将填充

程序测试放在与普通测试不同的程序集中,则可以选择创建另一个解决方案(因此,一个具有填充程序集,另一个没有填充程序集),或者让具有较低版本的 Visual Studio 的团队成员从其解决方案中卸载填充项目。

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

这是该问题的透明解决方案(因此您无需担心团队将来会忘记它的工作方式),不需要手动编辑项目文件,也不需要您记住将所有特定测试包装在#if s中。 它是否适用于您的团队取决于您的解决方案和项目结构的整体方法。