【问题标题】:RegAsm failing for a .NET 4.0 assembly using Microsoft.Bcl.Async使用 Microsoft.Bcl.Async 的 .NET 4.0 程序集的 RegAsm 失败
【发布时间】:2013-11-22 10:03:53
【问题描述】:

使用 Microsoft.Bcl.Async 的 .NET 4.0 程序集的 RegAsm 失败,并显示以下消息:

RegAsm:错误 RA0000:无法加载文件或程序集
'System.Threading.Tasks,Version=1.5.11.0,Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。
找到的程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040)

我的程序集(MyAssembly.dll)使用最新的Microsoft.Bcl.Async NuGet 包,这是项目的packages.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.Bcl" version="1.1.6" targetFramework="net40" />
  <package id="Microsoft.Bcl.Async" version="1.0.165" targetFramework="net40" />
  <package id="Microsoft.Bcl.Build" version="1.0.13" targetFramework="net40" />
</packages>

它捆绑了System.Threading.Tasks.dll 版本:2.6.6.0,它是 NuGet 包的一部分。目标系统(带有 .NET 4.0 但没有 .NET 4.5 的 Win7)上没有其他 System.Threading.Tasks.dll,在 GAC 和其他任何地方都没有。

这里是MyAssembly.dll.config,它有正确的bindingRedirect元素System.Threading.Tasks

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

我的问题:RegAsm 不使用MyAssembly.dll.config 吗?如何使它工作以解决 bindingRedirect 指令?

【问题讨论】:

    标签: c# .net nuget async-await regasm


    【解决方案1】:

    我想出的解决方案是 hack:

    • RegAsm.exeRegAsm.exe.configC:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe复制到MyAssembly.dll所在的本地文件夹;

    • RegAsm.exe.config 编辑为如下所示:

    <?xml version ="1.0"?>
    <configuration>
        <startup useLegacyV2RuntimeActivationPolicy="true">
            <requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
            <supportedRuntime version="v4.0" sku="client" />
        </startup>
    
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-2.6.6.0" newVersion="2.6.6.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    
    </configuration>
    
    • 现在,运行 RegAsm.exe /codebase MyAssembly.dll 可以正常运行。

    有趣的是,useLegacyV2RuntimeActivationPolicy="true" 已经存在于标准 RegAsm.exe.config 中,但仅此一项并没有帮助。

    我认为这与此处报告的错误相同:https://connect.microsoft.com/VisualStudio/feedback/details/789318/asyncpack-system-io-fileloadexception-could-not-load-file-or-assembly-system-threading-tasks-version-1-5-11-0

    【讨论】:

    • 干得好——谢谢。版本号现在是 2.6.8.0,但这工作正常。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多