2011-05-06 63 views
18

我的任務是爲應用程序創建一個新模塊,所以我將新的DLL添加到項目中。這一切都很好。使用同一個DLL的多個版本

但是,在我的DLL中,我想使用新版本的外部DLL(我無法控制它)。如果我只是引用新的DLL並只使用那個DLL,我的代碼就可以工作,但舊代碼將停止運行。

Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral, 
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040) 

我試過一個簡單的改變DLL名稱的竅門,但那顯然有點太天真了,以爲它會工作。我試過使用外部別名(通過在我的參考文獻中定義它們),但我仍然不知道如何將具有相同名稱的兩個文件合併到一個BIN文件夾中...

我該怎麼辦?

回答

10

您可以load another version into a specific AppDomain

可能太詳細了,但這裏是演示在一個有用的設置使用的AppDomain的文章,他們是如何工作的:

http://msdn.microsoft.com/en-us/magazine/cc164072.aspx

在一個非常基本的意義上,它歸結爲此示例代碼:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    ... 

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     if (/*some condition*/) 
      return Assembly.LoadFrom("DifferentDllFolder\\differentVersion.dll"); 
     else 
      return Assembly.LoadFrom(""); 
    } 
+0

不像我所希望的那麼漂亮,但它完成了工作。謝謝! – Shaamaan 2011-05-06 21:31:29

+1

我已經允許自己編輯您的答案,以包含我用於解決問題的代碼示例。但主要原因是第二個環節已經很長時間了。你能否偶然地將類似的資源與舊的資源聯繫起來? – Shaamaan 2015-09-08 13:19:08

+1

@Shaamaan我無法找到原始鏈接提到:(這是一個很好的入口頁面,可能是一個很好的替代品:https://msdn.microsoft.com/en-us/library/ms172158(v=vs .110).aspx – sehe 2015-09-08 13:47:37

0

如果應用程序域解決方案並不適用於你的情況,你是在時間壓力下,有矛盾的要求(如沒發生),並且不介意可笑做作黑客:

  • 反編譯使用ildasm工具組件的新版本(的一部分包含在Visual Studio中的開發人員命令提示符)
  • 編輯生成的.il文件以查找/替換程序集名稱空間引用。使用引用的例子,這將是從itextsharp.X更改itextsharp.new.X
  • 同樣,編輯爲AssemblyTitleAttribute值。這需要將ASCII字符轉換爲十六進制。
  • 重新編譯使用ilasm
  • 注意,這可能需要重複任何依賴程序集的.il內的文件(例如 - someassembly.core.whatever)
  • 添加新的.dll到你的項目使用不同的名稱並明確地引用它們(而不是通過nuget或其他)

嘿,別看着我那樣。我確實說可笑地做作了黑客...

相關問題