2009-11-12 77 views
0

我有一個應用程序,需要與兩個版本的DLL工作。我想我只會編譯一次該應用程序,將該exe文件複製到兩個目錄中,然後將這兩個版本的dll複製到這些目錄中的每一個。僅供參考,我沒有對GAC做任何事情。但是,我得到了一個FileLoadException異常版本與它沒有編譯的DLL。FileLoadException與新版本的DLL

在項目中,我將「特定版本」設置爲虛假的dll引用。但是,也許這是錯誤的設置。我如何獲得這個工作與多個版本?

回答

0

我反對改變配置文件,只是因爲這是我需要做的另一件事。關於不同版本的DLL的地址更改,我不認爲我有這個問題,因爲我實際上使用一個接口來調用我的方法。

爲了提供更多的細節,我只需要在多個dll中創建一種類型的實例。從那裏,我把它當作一個接口對象。所以,這裏是我的解決方案:

Assembly asm = Assembly.LoadFrom("XXX.YYY.ZZZ.Bin.dll"); 
Type type = asm.GetType("MyType"); 
IMyType obj = Activator.CreateInstance(type) as IMyType; 

這似乎工作。

2

如果您所引用的程序集是強簽名的,則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在運行時。

0

這是因爲每次重新編譯dll時,函數的地址都會改變。由於你在編譯時綁定你的應用程序和你的dll,這些地址被設置爲在你的應用程序中被修復。基本上你必須每次都用新版本的dll重新編譯你的程序(或者更確切的說,當你混淆數據結構時)或者使用動態加載和GetProcAddress。

0

確保程序集的兩個版本具有AssemblyInfo.cs文件中指定的相同AssemblyVersion。

例:

[assembly: AssemblyVersion("1.0.0.0")] 

我相信2008年之前VS新項目產生的默認值是:

[assembly: AssemblyVersion("1.0.0.*")] 

將每次建立時自動遞增程序集版本。

這對於assemblies that are signed尤其重要,因爲程序集的強名稱包含其版本。