从.Net v4.0程序集链接到.Net v2.0程序集也似乎链接(和别名)mscorlib v2.0.为什么?

我有一个.Net程序集,它导入一个与v2.0运行时链接的程序集.我遇到的问题是,当我尝试在我的程序集上运行一些测试时,Fusion会尝试加载错误版本的依赖程序集.

在查看程序集清单后,我可以看到原因:FSharp.Core的错误版本已链接.在我的构建文件中,我制作FSharp.Core,版本= 4.0.0.0显式,但FSharpPowerPack似乎链接到v2.0.0.0,并且一些似乎“赢得”这个链接之战.

这是清单:

// Metadata version: v4.0.30319
.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern System.Core
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern System
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 4:0:0:0
}
.assembly extern FSharp.PowerPack
{
  .publickeytoken = (A1 90 89 B1 C7 4D 08 09 )                         // .....M..
  .ver 2:0:0:0
}
.assembly extern mscorlib as mscorlib_8
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 2:0:0:0
}
.assembly extern System.Core as System.Core_9
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
  .ver 3:5:0:0
}
.assembly extern FSharp.Core
{
  .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A )                         // .?_....:
  .ver 2:0:0:0
}

请注意,似乎通过包含FSharpPowerPack,包含其他.Net程序集(mscorlib,System,System.Core)的v2.0和v3.5并具有别名.为什么会这样?这是否与加载错误版本的FSharp.Core有关?

编辑:为了澄清,我的程序集是由C#v4.0编译器生成的.

最佳答案 您是否可以控制将加载已编译程序集的应用程序?如果是这样,您可以在app.config文件中使用绑定重定向来强制所有FSharp.Core引用使用版本4.0:

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="4.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

如果您遇到自动测试应用程序的问题,您可能能够以类似的方式编辑其配置文件,假设它不会影响其操作.

点赞