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

C# 基于常量的Visual Studio条件项目引用,c#,visual-studio,reference,project,conditional-compilation,C#,Visual Studio,Reference,Project,Conditional Compilation,对于用户授权,我只想为每个用户包含一个特定的模块。所以我像这样配置了条件编译 <DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants> TRACE;调试;样本常数1 并按如下方式编辑项目文件: <ProjectReference Include="..\Solution1.Modules.Module1\Solution1.Modules.Module1.csproj" Condition="$

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

<DefineConstants>TRACE;DEBUG;SAMPLECONSTANT1</DefineConstants>
TRACE;调试;样本常数1
并按如下方式编辑项目文件:

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

{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}
解决方案1.Modules.Module1
对于这种情况,如果
DefineConstants
包含
SAMPLECONSTANT1
,我想添加对项目
Module1
的引用;但无论我在
DefineConstants
中输入什么,解决方案总是加载
模块1
项目。我做错了什么


更新:实际上我的代码是正确的。请参阅J0e3gan的答案。Visual Studio UI不反映项目的
引用
文件夹中的条件引用。因此,在任何给定配置或平台选择中,所有参考都是可见的。另一方面,编译器和IntelliSense知道条件引用,在生成过程中通过视觉反馈和错误通知来尊重正确的设置。

我怀疑问题在于您正在调整对
模块1
的项目引用,而不是在解决方案中是否包括
模块1

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

更新:

如果你真的想限制一个项目引用,Joe Wrobel写道这应该会有所帮助。关键要点是将包含
ProjectReference
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>

{4E378BD0-4FF8-4160-9331-1ECBFD2B6F30}
解决方案1.Modules.Module1
从我今晚的测试来看,这非常有助于调整项目引用是否定义了一个常量,如
SAMPLECONSTANT1
。但是,请注意,无论是否定义了条件常量,条件项目引用都不会显示在“解决方案资源管理器”中的(将要)引用项目的“引用”文件夹下


为了确保条件作用有效,我必须构建:定义了
SAMPLECONSTANT1
,引用项目成功构建,同时使用
模块1
中定义的类,正如预期的那样;而如果未定义
SAMPLECONSTANT1
,则引用项目无法生成,因为无法解析
模块1
中定义的类-这也是预期的。

接受的答案对我不起作用。然而,我并不暗示这是错误的。对我有效的是:


更改常量时,我没有收到任何错误。

如果要使用调试常量,请确保在项目属性(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>


请您详细说明一下,似乎不太清楚,我只是更新了我的问题,对于这个问题,如果DefineConstants包含SAMPLECONSTANT1,我想添加对项目模块1的引用,但无论我在DefineConstants中添加了什么,解决方案总是加载Module1项目我的想法是,如果在运行时而不是编译时加载模块会更好。您可以使用反射或MEF来实现这一点。我在这方面做了一些工作,是基于我的理解,即您确实是在试图限制项目参考,而不是将项目包含在解决方案中:我发现了一种对我很有效的方法;希望你会发现它对你很有用。如果我引用了一个DLL,而不是一个项目,它可以像这样正常工作:
因此我不知道ProjectReference为什么不工作。你的答案是正确的,我测试了它,它工作了,我只检查了项目的References文件夹,仍然可以看到项目,这就是为什么我认为我的代码不起作用,如此愚蠢。对于任何对此感兴趣的人,您也可以使用我的代码,不使用
Choose
When
tag:)@chinhnguyenvan:没错。多么具有讽刺意味:我不得不通过
Choose
方法来发现引用与构建之间的区别——然后发现(由您的评论提示)它也对您的方法产生了影响!MSDN对此进行了一些讨论。现在我想知道Eugene Zakhareyev是否真的是指“你当然可以调整引用,使它们有条件;问题是它将在VS中[][in]可见,并且不能通过UI编辑…”在他的回答中。@chinhnguyenvan:有趣的是:所以我确定了你的指示,条件参照总是在参照下可见……和我的经验,条件参照总是不可见之间的区别。使用
ProjectReference
元素的
Condition
属性,条件项目引用始终显示在References下,如您所述;使用
选择
-
当我概述了
方法时,项目引用总是在引用下可见。奇怪的。:)顺便说一句,我用Visual Studio 2010 Professional SP1测试了所有内容,以获得完整的上下文。您的指示是正确的,我们的两个代码都可以工作,它们只是在参考文件夹中可见。非常感谢你的帮助。