2015-04-07 43 views
1

下面是確切的場景。我有一個來自第三方供應商的x86彙編,我想用NServiceBus。但是,當NServiceBus嘗試掃描程序集時,我很快就會遇到級聯的BadImageFormat異常。這是我可以通過使用x86版本的NServiceBus修復的,但後來我必須更改所有其他引用的庫來執行相同的操作,其中一些依賴於x64程序集。x86與x64 .NET Framework庫的IL有任何區別嗎?

我能想出的最簡潔的解決方案是使用corflags.exe將第三方程序集修改爲AnyCPU。這樣我就不必修改任何其他許多引用的庫爲x86。到目前爲止,這是完美的。

但是,我已經被警告過,如果第三方庫引用任何在x86和x64中具有不同實現的庫,那麼這可能是一個問題。

所以我的問題是,在x86和x64 .NET Framework庫的IL中是否有任何區別,例如,System。* x64的IL等於System。* x86的IL?

據我所知,平臺目標只是開發人員設置的首選項,並不會影響實際產生的IL;使用corflags.exe轉換第三方程序集的解決方案應該是安全的,只要.NET Framework在x64和x86程序集中也使用相同的IL。是這樣嗎?

根據註釋的問題:第三方庫引用(我知道這從反編譯的第三方庫)

  • 系統
  • System.Runtime.Serialization
  • System.Runtime.Serialization
  • mscorlib程序
  • (它們的依賴)

並且所有版本是4.0.0.0。

+0

您被警告說第三方庫可能存在問題,之後您會詢問System.Collections。是System.Collections第三方庫爲你? – mybirthname

+0

您是否可以不用將項目解決方案更改爲'AnyCPU'與使用corflags.exe相比,您還在4.0或4.5下運行項目的哪個版本.net? – MethodMan

+0

@MethodMan:不,我得到一個BadImageFormat異常,如果我將項目解決方案更改爲x86以外的任何東西。我正在.NET 4.5下運行該項目。 – exceptionerror

回答

1

無論.NET進程使用什麼位,.NET Framework都可以正常工作。 C#編譯器不關心位數。它所做的只是設置可以更改的PE標誌。

顯然,您想要修改的第三方庫可能依賴於參考位的固定位數或簡單包含Debug.Assert(IntPtr.Size == 4);的位數。就這樣。

我被告誡說,一般情況下用corflags將x86轉換成x64程序集可能會導致問題。

是的。

System.Collections程序集就是一個例子。

不知道從哪裏來...假。