2010-10-01 39 views
4

我有一个.Net程序集,它导入与v2.0运行时链接的程序集。我遇到的问题是,当我尝试在我的程序集上运行一些测试时,Fusion会尝试加载相关程序集的错误版本。从.Net v4.0程序集链接到.Net v2.0程序集似乎也链接(和别名)mscorlib v2.0。为什么?

查看程序集清单后,我可以看到为什么:连接了FSharp.Core的错误版本。在我的构建文件中,我制作了FSharp.Core, Version=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.Core程序)的v2.0和v3.5版本都包含和别名。为什么会发生?这与加载FSharp.Core的错误版本的问题有关吗?

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

+0

这个呱呱叫就像一个F#编译器的bug。检查是否可以用C#编译器重新引用这些程序集并创建一些对象。我对此表示怀疑。如果没有,则ping通connect.microsoft.com。 – 2010-10-01 18:55:19

+0

@Hans Passant - 这实际上是生成此清单的C#编译器。我只是链接到F#库... – codekaizen 2010-10-01 19:01:10

回答

2

你在控制将加载编译程序集的应用程序吗?如果是这样,你可以使用绑定重定向在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> 

如果您有一个自动化测试应用的问题,您也许能以类似的方式编辑其配置文件,假设它不影响其操作。

+0

迈克 - 问题是不与FSharp.Core。它与mscorlib.dll和System.dll。 – codekaizen 2010-11-04 00:06:54

+0

从您的描述看来,似乎加载正确版本的FSharp.Core也可能修复mscorlib.dll和System.dll问题 – matheeeny 2010-11-04 04:38:38

+0

我认为你应该能够对其他程序集做同样的事情,只要你改变名称和公钥标记来匹配其他程序集的标记。 – 2010-11-04 13:44:16