Visual Studio 项目:如何仅为一个配置添加引用?

23

环境:VS2008 C#项目

我需要构建我的应用程序以在两个不同的环境中使用。在其中一个环境中,我需要使用第三方DLL程序集。

我可以使用#if块来隔离使用此DLL的代码。但是如何有条件地包含CS项目文件中对DLL的引用?

编辑:womp在他的评论中提出了一个很好的观点。我已经将其变成一个单独的问题:如果从未调用该引用的DLL,它是否会被加载? TIA,


2
为什么不直接将它保留在两个位置,让dll配置基于使用,并避免复杂化?只有在必要时才加载DLL。第三方dll是否存在许可问题? - womp
非常好的问题实际上。(我不分发第三方DLL。它由制造商在一些系统上安装。) - Serge Wautier
4个回答

26

卸载该项目并以 .XML 格式打开。

找到引用项标记并添加 Condition 属性。

例如:

<ItemGroup>
  <Reference Include="System.Core">
    <RequiredTargetFramework>3.5</RequiredTargetFramework>
  </Reference>
  <Reference Include="System.Data" />
  <Reference Include="System.Drawing" />
  <Reference Include="System.Xml" />

  <Reference Include="MyUtilities.Debug"
    Condition="'$(Configuration)'=='Debug'"/>

</ItemGroup>

注意最后一个引用现在有一个条件。


2
这也是我的想法,所以我尝试了一下。在我的情况下,这导致所有配置中的引用失败(系统表现出无法找到程序集的情况)。 - Fredrik Mörk
2
问题在于,IDE忽略了有条件的东西,在这种情况下,它需要它的所有种类的原因(智能感知、对象浏览器...)。因此,它会抱怨。此外,您还需要将对该程序集的调用设置为有条件的,否则编译器将无法找到代码所引用的程序集。 - Coincoin
只是为了帮助其他人:在使用CLI中的MSBuild时,使用/p标志(例如:/p:MYFLAG=true)来设置XML中的变量。 - Dan W

2

我知道这是一个旧的帖子,但如果有人在找答案之前像我一样找到了它,那么就需要使用项目文件中的“选择”元素:

链接

您可以在一个地方定义条件引用和条件编译,因此您不必在代码中使用#if。

它适用于SharpDevelop,并且由于这是微软的文档,我认为它也适用于Visual Studio。


1
以下在csproj文件的引用项组中对我而言在vs 2008中有效:
<Reference Include="DRLClasses, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" Condition=" '$(Configuration)' == 'Debug' ">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\..\..\Visual Studio User Library\Debug\DRLClasses.dll</HintPath>
</Reference>
<Reference Include="DRLClasses, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL" Condition=" '$(Configuration)' == 'Release' ">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\..\..\..\Visual Studio User Library\Release\DRLClasses.dll</HintPath>
</Reference>

5
你可以通过直接将 $(Configuration) 变量添加到 HintPath 中来简化此过程:<Reference Include="DRLClasses, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <SpecificVersion>False</SpecificVersion> <HintPath>..\..\..\..\Visual Studio User Library\$(Configuration)\DRLClasses.dll</HintPath> </Reference> - awe

0
受到此处所示的问题和答案的启发,您可以在想要有条件地运行的部分周围添加<Choose><When Condition> 命令。例如:
<Choose>
  <When Condition="$(USEDLL) == true">

    <ItemGroup>
    <EmbeddedResource Include="test.dll">
    <LogicalName>test.dll</LogicalName>
    </EmbeddedResource>
    </ItemGroup>

  </When>
</Choose>

然后在CLI中,只需像这样在MSBuild中使用/p属性:

MSBuild "C:\myproject\myproject.sln" /p:USEDLL=true

...或者如果您不想要 DLL,只需:

MSBuild "C:\myproject\myproject.sln" /p:USEDLL=false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接