2012-04-02 49 views
1

我們爲一個爲.NET 3.5構建的軟件創建了一個插件。在這個插件中,我們引用了適用於.NET 3.5的第三方.DLL。主要的軟件現在已經構建到.NET 4.0和第三方.DLL已經被分成兩個.DLL。程序集解析

我們想要避免的是有兩個獨立的解決方案,幾乎完全相同的代碼(一個構建到.NET 4.0引用4.0 DLL,一個構建到3.5引用3.5 DLL)。並非我們所有的客戶都會升級到我們立即創建插件的最新版軟件,有些人可能會等上幾年。

問題EDITED

有什麼辦法繼續建立以.NET 3.5引用3.5 DLL,然後在運行時執行一些裝配決心加載兩個.NET 4.0的DLL的地方原來的一個?

我們希望/需要繼續構建到3.5框架,以便主要軟件的以前版本將繼續加載我們的插件。如果我們構建到4.0,那麼當嘗試加載我們的插件時,舊版本會產生錯誤,因爲它的構建到了後面的框架。

+1

您是否真的嘗試過這種方法?還是隻是猜測可能存在問題?如果你這樣做了,那麼*正確*是錯誤信息? – 2012-04-02 17:26:00

+0

當我嘗試使用舊版本的軟件加載4.0插件時,出現以下錯誤: 無法加載程序集。錯誤詳細信息:System.BadImageFormatException:不能 加載文件或程序集file:/// C:\ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll'或它的一個依賴關係。該程序集由比當前加載的運行時更新的 運行時構建,無法加載。 在System.Reflection文件名:'file:/// C:\ Users \ ******* \ Documents \ Visual Studio 2010 \ Projects \ RandomProjects \ A2013Testing \ bin \ Debug \ A2013Testing.dll' 。 – 2012-04-02 17:51:06

回答

1

該組件由運行時比當前加載的運行庫

新那晶瑩剔透建,你的EXE加載CLR的早期版本。只有CLR的.NET 4版本知道如何加載爲目標4構建的程序集。元數據格式已在4中更改,舊的CLR不知道如何讀取它。

要麼將​​您的EXE重建爲目標4,要麼提供一個app.exe.config文件,強制您的程序使用較新版本的CLR運行。它應該是這樣的:需要

<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
     <supportedRuntime version="v4.0" /> 
    </startup> 
</configuration> 

一些測試,.NET 4的高度兼容的,但它也有一些bug修復,你可能會意外地依靠。

+0

這不是我們的可執行文件,可執行文件正在嘗試加載我們的DLL。可執行文件使用4.0構建,而以前的可執行文件使用3.5構建。我們正試圖讓我們的DLL與兩者兼容。 4.0可執行文件會加載一個3.5 DLL,但是我們的3.5 DLL需要引用該版本的第三方4.0參考,以及早期版本的3.5 DLL。 – 2012-04-02 19:06:13

+0

只有EXE才能確定將加載哪個版本的CLR。因爲它首先開始。如果你得到這個異常,那麼你可以確定它是導致問題的EXE。並且它的目標是構建目標3.5獲取任何4.0 DLL的唯一方法是強制EXE加載CLR版本4.這要求將其構建爲目標4或此.exe.config文件。您可能需要與EXE的所有者進行交流以解決問題,他們可能不一定會爲此感到高興。 – 2012-04-02 19:28:30

0

如果結構完全相同(同時支持1個程序集),則在.NET 4運行庫中加載.NET 3.5庫時不存在問題。 (我在IronScheme中做了很多,因爲我懶得在VS2010上構建)。

+0

不知道我是否清楚,我編輯了這個問題。謝謝。 – 2012-04-02 17:25:24