Visual Studio 项目:如何仅包含一种配置的参考?

Posted

技术标签:

【中文标题】Visual Studio 项目:如何仅包含一种配置的参考?【英文标题】:Visual Studio Project: How to include a reference for one configuration only? 【发布时间】:2010-12-02 09:35:28 【问题描述】:

环境:VS2008 C# 项目

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

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

编辑:womp 在他的评论中有一个很好的观点。我变成了separate question:如果引用的 DLL 从不被调用,它会被加载吗? TIA,

【问题讨论】:

你为什么不把它放在两者中,基于 dll 配置的使用,避免复杂化呢?除非必要,否则不会加载 DLL。第三方 dll 是否存在许可问题? womp,非常好的问题。 (我不分发第 3 方 DLL。它由制造商安装在某些系统上)。 【参考方案1】:

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

找到引用项标签并添加条件属性。

例如:

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

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

【讨论】:

这也是我的想法,所以我尝试了一下。在我的情况下,导致所有配置中的引用都失败(系统表现得好像找不到程序集)。 是的,问题是,IDE 会忽略有条件的东西,在这种情况下,它出于各种原因(智能感知、对象浏览器......)都需要它,所以它会抱怨。此外,您必须有条件地对该程序集进行调用,否则编译器将无法找到代码所引用的程序集。 也许只是为了帮助其他人:在 CLI 中使用 MSBuild 时,使用 /p 标志(例如:/p:MYFLAG=true)在 XML 中设置变量。【参考方案2】:

我知道这是一篇旧帖子,但如果其他人在找到答案之前找到它,就像我一样,那就是:您需要在项目文件中使用“Choose”元素:

link

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

它可以在 SharpDevelop 中使用,由于它是 MS 的文档,我认为它可以在 Visual Studio 中使用。

【讨论】:

【参考方案3】:

以下,在 csproj 文件中引用 itemgroup 在 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>

【讨论】:

您可以通过直接在 HintPath 中添加 $(Configuration) 变量来简化此操作:&lt;Reference Include="DRLClasses, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"&gt; &lt;SpecificVersion&gt;False&lt;/SpecificVersion&gt; &lt;HintPath&gt;..\..\..\..\Visual Studio User Library\$(Configuration)\DRLClasses.dll&lt;/HintPath&gt; &lt;/Reference&gt;【参考方案4】:

受shown here问答的启发,您可以在要有条件运行的部分周围添加&lt;Choose&gt;&lt;When Condition&gt;命令。例如:

<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

【讨论】:

以上是关于Visual Studio 项目:如何仅包含一种配置的参考?的主要内容,如果未能解决你的问题,请参考以下文章

如何限制部署后脚本在 Visual Studio 数据库项目中仅运行一次

在 Visual Studio 项目中创建包含文件夹和 Lib 文件夹

如何在 Visual Studio 代码中仅搜索特定文件类型?

如何仅为调试构建运行 Visual Studio 构建后事件

如何创建包含链接文件的 Visual Studio 项目模板?

Visual Studio 断点仅适用于第二次调试尝试