根据我的项目是被编译为Build还是Release版本,使用Debug或Release版本的第三方库进行编译,在Visual Studio 2010中。

46
我已经下载了一些适用于Visual Studio 2010/C#的第三方库(dll),我注意到在它们发布的 \bin 目录中通常有两个版本:Debug和Release。
请问是否有办法将这些库添加为项目引用,但在构建发布版本时使用Release版本,在调试时使用Debug版本呢?
4个回答

76
<Reference Include="MyLib">
   <HintPath>..\lib\$(Configuration)\MyLib.dll</HintPath>
</Reference>

1
绝对是最佳答案,完美运作。我尝试了被标记为正确的那个,但它没有起作用(在VS2017中有两个引用和一个感叹号)。 - Krypto_47

42

您可以手动编辑csproj文件,在包含引用的ItemGroup上设置Condition属性。

  <ItemGroup Condition="'$(Configuration)' == 'Debug'">
    <Reference Include="MyLib">
      <HintPath>..\..\Debug\MyLib.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Reference Include="MyLib">
      <HintPath>..\..\Release\MyLib.dll</HintPath>
    </Reference>
  </ItemGroup>

查看此文章以获取更多信息。


1
@PHeilberg 当我保存我的.csproj文件时,它不会覆盖这个,对吧? - leeand00
1
@leeand00:不会,只要你已经在Visual Studio中加载了设置,它就会保留这些设置。如果你在VS打开的情况下进行更改,它会提示你重新加载解决方案以应用更改。 - PHeiberg
5
使用条件属性有一个有点令人困惑的地方,就是在 Visual Studio 中会显示两次引用,但实际上只有符合当前配置的那个引用才会被应用。 - PHeiberg
1
在某些情况下,csproj 的替代更改可能是将 Configuration 变量插入到 dll 的 HintPath 中,例如: <HintPath>....$(Configuration)\MyLib.dll</HintPath> - Bovaz

12

如果您使用发布文件夹和调试文件夹,那么WaffleSouffle的答案绝对是最好的,因为原始问题已经说明。

似乎还有另一种不太明显的选项,因为在编辑csproj文件时,VS(VS2010)没有在智能感知中显示它。

您可以将条件添加到HintPath元素中。像这样:

<Reference Include="MyLib">      
      <HintPath Condition="'$(Configuration)'=='Release'">..\lib\MyLib.dll</HintPath>
      <HintPath Condition="'$(Configuration)'=='Debug'">..\lib\Debug\MyLib.dll</HintPath>
</Reference>

我发现了Vivek Rathod的一篇文章,描述了上述方法,链接为:http://blog.vivekrathod.com/2013/03/conditionally-referencing-debug-and.html

我检查了项目文件的XMS Schema文件,在以下位置: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild\Microsoft.Build.Core.xsd 和 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild\Microsoft.Build.Commontypes.xsd

我没有看到Condition是HintPath元素的一个支持属性,但它似乎确实能够工作.....

编辑1: 这不会使引用在Visual Studio中显示两次,这是接受答案的问题。

编辑2: 实际上,如果您完全省略HintPath,则Visual Studio将查找项目的输出文件夹。 因此,您实际上可以这样做:

<Reference Include="MyLib">        
     <!-- // Removed HintPath, VS looks for references in $(OutDir) --> 
</Reference> 


搜索顺序在文件Microsoft.Common.targets中指定
参见: Visual Studio中的HintPath vs ReferencePath


在Visual Studio中如何以可视化的方式完成相同的操作? - user10997800

0

是的,但可能不能在VS2010内本地化。您可以编辑.csproj文件并使用条件属性来创建对发布版或调试版的引用。

<Reference Include="MyLib" Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  <HintPath>..\lib\Debug\MyLib.dll</HintPath>
</Reference>

或者

<Reference Include="MyLib" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <HintPath>..\lib\Release\MyLib.dll</HintPath>
</Reference>

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