基于常量的Visual Studio条件项目引用

本文关键字:Studio Visual 条件 项目 引用 于常量 常量 | 更新日期: 2023-09-27 18:13:30

对于用户授权,我只想为每个用户包含一个特定的模块。所以我像这样配置条件编译

<DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants>

并编辑项目文件如下:

<ProjectReference Include="..'Solution1.Modules.Module1'Solution1.Modules.Module1.csproj" Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
  <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
  <Name>Solution1.Modules.Module1</Name>
</ProjectReference>

对于这种情况,如果DefineConstants包含SAMPLECONSTANT1,我想添加对项目Module1的引用;但无论我在DefineConstants中输入什么,解决方案总是加载Module1项目。我在这里做错了什么?

UPDATE:实际上我的代码是正确的。请看J0e3gan的回答。Visual Studio UI不反映项目的References文件夹中的条件引用。因此,在任何给定的配置或平台选择中,所有引用都是可见的。另一方面,编译器和智能感知感知条件引用,在构建过程中通过视觉反馈和错误通知来尊重正确的设置。

基于常量的Visual Studio条件项目引用

我怀疑问题是您将项目参考调整为Module1,而不是是否在解决方案中包含 Module1

在解决方案中包含一个项目(并因此将其与解决方案一起加载)和一个项目在解决方案中引用另一个项目当然是两件不同的事情。

更新:

如果你真的想要约束一个项目参考, Joe Wrobel写了一篇相关的博客文章,应该会有所帮助。关键是将包含ProjectReference to条件的ItemGroup包装在Choose元素中—例如:

<Choose>
  <When Condition="$(DefineConstants.Contains('SAMPLECONSTANT1'))">
    <ItemGroup>
      <ProjectReference Include="..'Solution1.Modules.Module1'Solution1.Modules.Module1.csproj">
        <Project>{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}</Project>
        <Name>Solution1.Modules.Module1</Name>
      </ProjectReference>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <!-- other ProjectReference elements -->
    </ItemGroup>
  </Otherwise>
</Choose>

从我今天晚上的测试来看,这对于项目参考是否定义了像SAMPLECONSTANT1这样的常量非常有效。然而,请注意,条件项目引用不会在(可能的)引用项目的references文件夹下的解决方案资源管理器中显示 - 无论是否定义了条件常数。

要看到条件作用,我必须在SAMPLECONSTANT1 定义的情况下构建: ,引用项目在使用Module1中定义的类时成功构建 -正如预期的那样;和没有定义SAMPLECONSTANT1 ,引用项目无法构建,因为Module1中定义的类无法解析-也是预期的。

接受的答案对我不起作用。然而,我并不是说这是不正确的。对我有用的是:

<Import Project="..'MnM.GWS.Chip2'MnM.GWS.Chip1.projitems" Label="Shared" Condition="$(DefineConstants.Contains('Chip1'))" />
<Import Project="..'MnM.GWS.Chip2'MnM.GWS.Chip2.projitems" Label="Shared" Condition="$(DefineConstants.Contains('Chip2'))" />

我没有得到任何错误,而更改常数

如果你想使用DEBUG常量,请确保它在你的项目属性(Properteis>建立在定义DEBUG常量).

基于接受答案的样本:

  <Choose>
    <When Condition="$(DefineConstants.Contains('DEBUG'))">
      <ItemGroup>
        <ProjectReference Include="..'..'..'..'..'MyLocalProjectPath.csproj" />
      </ItemGroup>
    </When>
    <Otherwise>
      <ItemGroup>
        <PackageReference Include="MyNugetPackage" Version="2.1.4" />
      </ItemGroup>
    </Otherwise>
  </Choose>