如何在VS 2012中使用app.config文件来配置C++/CLI程序集绑定?

8
我目前正在使用 Microsoft BCL Async 库 (这里),在一个大量依赖的程序集中编译了 .NET 4 Full Profile,我不得不在每个项目中使用程序集绑定重定向来进行编译(参见此处的问题2here)。
现在我的问题是,我从 C++/CLR DLL 项目中调用其中一个库,它实际上不需要使用 async,但我遇到了以下编译错误:
2>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1578,5): warning MSB3268: 主引用“ImInterface.dll”无法解析,因为它对框架程序集“System.Runtime,Version=1.5.11.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”具有间接依赖关系,而该程序集在当前目标框架“.NETFramework,Version=v4.0”中无法解析。要解决此问题,请删除引用“ImInterface.dll”,或将应用程序重新定位到包含“System.Runtime,Version=1.5.11.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的框架版本。
我已经在所有 C# 项目中使用了相同的 app.config 文件,但它似乎对 C++ 项目没有任何影响。我是否需要将其放置在特定目录中或执行其他步骤以使 app.config 文件被识别?
我的 app.config 文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.11.0" newVersion="2.5.11.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.5.11.0" newVersion="2.5.11.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

非常感谢您的建议!

祝好, 安东尼


你修好了吗,安东尼?我也遇到了类似的错误,但我的问题与C++无关。 - James Mundy
嗨詹姆斯,不幸的是 - 没有人提供任何有用的建议。我在圣诞节期间离开了,所以下周我会再次研究这个问题,因为这对我们来说是一个重要的项目。 你具体遇到了什么问题?是关于C#项目的吗?我帖子中的app.config文件应该能够帮助解决这个问题... - Anthony
我的问题与C#和Windows Phone/8的可移植类库有关。我在不久之后发现了一个与我的问题类似的stackoverflow问题https://dev59.com/omjWa4cB1Zd3GeqPu-Bd。虽然错误非常相似,但不幸的是它似乎与你的问题无关。 - James Mundy
1个回答

7
我曾遇到同样的问题,结果发现 <SpecificVersion>True</SpecificVersion> 起了作用。
在继续阅读之前,请注意:此问题似乎只会在使用“Visual Studio 2012 - Windows XP(v110_xp)”平台工具集构建 C++/CLI 项目时出现!也就是说,如果您不需要创建与 WinXP 兼容的 DLL,请切换到“Visual Studio 2012(v110)”,那么问题应该就解决了。
让我详细说明一下我的情况:我有一个针对 WinXP(v110_xp)的 C++/CLI 控制台应用程序项目(ConsoleAppCLI)。ConsoleAppCLI 引用了一个库(AsyncLib),该库通过 NuGet 安装了 Microsoft.Bcl.Async。
[ConsoleAppCLI.vcxproj]   (C++/CLI, .NET 4.0 v110_xp)
          |
          |
   [AsyncLib.csproj]      (C#, .NET 4.0)
          |
          |
 [Microsoft.Bcl.Async]    (via NuGet)

我曾经遇到相同的问题,但是app.config也没能解决。下面的步骤帮助我解决了问题:

  1. 取消加载ConsoleAppCli.vcxproj
  2. 直接编辑vcxproj文件
  3. 找到已安装Async nuget包的库的引用(在我的情况下,AsyncLib.csproj的)
  4. 在和之间添加以下内容:<SpecificVersion>True</SpecificVersion>

请注意,ConsoleAppCLI是依赖树中的顶级项目。如果您有依赖于产生MSB3268的C++ / CLI程序集的程序集,则同样需要将<SpecificVersion>True</SpecificVersion>添加到引用中(例如,如果我有一个额外的C#库,其中ConsoleAppCli为其依赖项,则我还必须将对ConsoleAppCli的引用<SpecificVersion>True</SpecificVersion>)。

顺便说一句,这个解决方案来自这里


1
+1 我在一个使用异步扩展的 .Net 4.0 项目中遇到了同样的问题,这意味着我们的主要 C++ 项目将不再构建。添加了 "SpecificVersion" 后一切都恢复正常了... 谢谢 - reSPAWNed
我也可以确认,这描述了真正的问题,解决方案运行良好。谢谢! - DiableNoir

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