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

时间:2013-05-15 04:21:45

标签: c# visual-studio reference project conditional-compilation

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

<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>

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

更新:其实我的代码是正确的。请参阅J0e3gan的回答。 Visual Studio UI不反映项目的References文件夹中的条件引用。因此,在任何给定配置或平台选择中都可以看到所有引用。另一方面,编译器和IntelliSense知道条件引用,在构建期间通过视觉反馈和错误通知来表达正确的设置。

3 个答案:

答案 0 :(得分:21)

我怀疑问题在于您要将项目参考调整为Module1,而不是在解决方案中包含 Module1。< / p>

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

<强>更新

如果你真的想要一个项目引用,Joe Wrobel写了a related blog post应该有所帮助。关键点是将包含ItemGroup的{​​{1}}包裹在ProjectReference元素中 - 例如:

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> 这样的常量的项目引用很有用。但是, note 条件项目引用在(可能)引用项目的References文件夹下的解决方案资源管理器中不显示 - 无论是否调节常数被定义。

要了解条件是否有效,我必须构建并定义SAMPLECONSTANT1 ,引用项目已成功构建使用SAMPLECONSTANT1中定义的类 - 如预期的那样;并且未定义Module1 时,引用项目无法构建,因为无法解析SAMPLECONSTANT1中定义的类 - 也是预期的。

答案 1 :(得分:1)

接受的答案对我不起作用。但是,我并不暗示它是不正确的。对我有用的是: >>> import re >>> >>> var = 'column1;column2;column3\r\nval1;val2;val3\r\n;val4;val5;val6\r\n' >>> new_text = re.sub(r'(?<!column3)\r\n', r'temp\r\n', var) >>> new_text 'column1;column2;column3\r\nval1;val2;val3temp\r\n;val4;val5;val6temp\r\n' >>>

更改常量时没有任何错误。

答案 2 :(得分:0)

如果您想使用 DEBUG 常量,请确保在您的项目属性中启用它(Properteis > Build > Define DEBUG Constant)。

基于接受答案的样本:

  <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>