【问题标题】:How to use app.config file with a C++/CLI to configure assembly binding in VS 2012?如何使用带有 C++/CLI 的 app.config 文件在 VS 2012 中配置程序集绑定?
【发布时间】:2012-12-14 14:51:25
【问题描述】:

我目前在一个项目中使用 Microsoft BCL Async 库 (here),其中包含大量相互依赖的程序集,全部针对 .NET 4 Full Profile 编译,我不得不在每个项目中使用程序集绑定重定向来获取它编译(根据 issue 2 here)。

我现在遇到的问题是我从 C++/CLR DLL 项目中使用这些库之一,它实际上不需要使用异步,但我有以下编译错误:

2>C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1578,5):警告 MSB3268:无法解析主要引用“ImInterface.dll”,因为它有对框架程序集“System.Runtime, Version=1.5.11.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的间接依赖在当前目标框架中无法解决。 “.NETFramework,版本=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++ 无关
  • 嗨,詹姆斯,很遗憾没有 - 没有人提供任何有用的建议。我已经在圣诞节离开了,所以下周我会再次关注这个,因为它是我们使用的一个重要项目。你的问题具体是什么?一个 C# 项目?我帖子中的 app.config 文件应该对此有所帮助...
  • 我的与 C# 和 Windows Phone/8 的可移植类库有关 我在stackoverflow.com/questions/12597797/… 之后不久发现了一个与我的类似的 stackoverflow 问题。尽管错误非常相似,但不幸的是,它似乎与您的问题无关

标签: .net-4.0 visual-studio-2012 c++-cli


【解决方案1】:

我遇到了同样的问题,结果证明,&lt;SpecificVersion&gt;True&lt;/SpecificVersion&gt; 帮了大忙。

在继续阅读之前,请注意问题似乎在使用“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 包的库的引用(在我的例子中,&lt;ProjectReference&gt; 到 AsyncLib.csproj)
  4. &lt;ProjectReference&gt;&lt;/ProjectReference&gt; 之间,添加以下内容:&lt;SpecificVersion&gt;True&lt;/SpecificVersion&gt;

但是请注意,ConsoleAppCLI 是我在依赖关系树中的顶级项目。如果您有依赖于产生 MSB3268 的 C++/CLI 程序集的程序集,您同样必须将 &lt;SpecificVersion&gt;True&lt;/SpecificVersion&gt; 添加到引用中(例如,如果我有一个附加的 C# 库,其中包含 ConsoleAppCli 作为依赖项,我将不得不引用ConsoleAppCli &lt;SpecificVersion&gt;True&lt;/SpecificVersion&gt; 也一样)。

顺便说一下,这个解决方案来自over here

【讨论】:

  • +1 我在使用异步扩展的 .Net 4.0 项目中遇到了同样的问题,这意味着我们的主要 C++ 项目将不再构建。添加了“SpecificVersion”,一切都好起来了……谢谢
  • 我也可以确认,这描述了真正的问题并且解决方案工作正常。谢谢!
猜你喜欢
  • 2011-12-13
  • 2014-09-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
  • 2018-02-06
  • 2012-11-23
相关资源
最近更新 更多