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测试了所有内容,以获得完整的上下文。您的指示是正确的,我们的两个代码都可以工作,它们只是在参考文件夹中可见。非常感谢你的帮助。