我有一個應用程序,需要與兩個版本的DLL工作。我想我只會編譯一次該應用程序,將該exe文件複製到兩個目錄中,然後將這兩個版本的dll複製到這些目錄中的每一個。僅供參考,我沒有對GAC做任何事情。但是,我得到了一個FileLoadException異常版本與它沒有編譯的DLL。FileLoadException與新版本的DLL
在項目中,我將「特定版本」設置爲虛假的dll引用。但是,也許這是錯誤的設置。我如何獲得這個工作與多個版本?
我有一個應用程序,需要與兩個版本的DLL工作。我想我只會編譯一次該應用程序,將該exe文件複製到兩個目錄中,然後將這兩個版本的dll複製到這些目錄中的每一個。僅供參考,我沒有對GAC做任何事情。但是,我得到了一個FileLoadException異常版本與它沒有編譯的DLL。FileLoadException與新版本的DLL
在項目中,我將「特定版本」設置爲虛假的dll引用。但是,也許這是錯誤的設置。我如何獲得這個工作與多個版本?
我反對改變配置文件,只是因爲這是我需要做的另一件事。關於不同版本的DLL的地址更改,我不認爲我有這個問題,因爲我實際上使用一個接口來調用我的方法。
爲了提供更多的細節,我只需要在多個dll中創建一種類型的實例。從那裏,我把它當作一個接口對象。所以,這裏是我的解決方案:
Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll");
Type type = asm.GetType("MyType");
IMyType obj = Activator.CreateInstance(type) as IMyType;
這似乎工作。
如果您所引用的程序集是強簽名的,則CLR將不會加載它,只要它的版本不同於它所編譯的版本。你可以在這種情況下使用的配置文件來指定版本,你想用:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="YouAssemblyNameWithoutDotDll"
publicKeyToken="your-assembly-token"
culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
當然這個假設集的新版本具有相同的方法簽名或者你會得到一個MissingMethodException在運行時。
這是因爲每次重新編譯dll時,函數的地址都會改變。由於你在編譯時綁定你的應用程序和你的dll,這些地址被設置爲在你的應用程序中被修復。基本上你必須每次都用新版本的dll重新編譯你的程序(或者更確切的說,當你混淆數據結構時)或者使用動態加載和GetProcAddress。
確保程序集的兩個版本具有AssemblyInfo.cs文件中指定的相同AssemblyVersion。
例:
[assembly: AssemblyVersion("1.0.0.0")]
我相信2008年之前VS新項目產生的默認值是:
[assembly: AssemblyVersion("1.0.0.*")]
將每次建立時自動遞增程序集版本。
這對於assemblies that are signed尤其重要,因爲程序集的強名稱包含其版本。