2010-10-01 38 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