2011-05-04 68 views
0

好的,如何使用多個dll版本?

我在這裏有一個奇怪的。

我們目前有一個工具應用程序,它允許我們創建插件,這些插件只是帶有用戶控件的DLL,我只需使用Assembly.Load加載並創建新實例,添加到面板即可使用。

但是,插件可能包含第三方dll。

我該如何處理?

我試過壓縮插件並通過字節[]閱讀程序集,但是在嘗試加載時,出現錯誤,缺少依賴的dll,所以我甚至進一步將依賴的dll添加到zip中並讀取它們,同樣的錯誤..

也許我可以創建一個與依賴dll插件名稱的文件夾?

回答

0


我最近有一個完全相同的問題的項目。下面是我如何解決它:
- 爲每個模塊(插件)創建一個單獨的目錄,裏面我把主module.dll庫和目錄lib,其中我把所有模塊相關的庫。
- 在主Form_Load事件把

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

其中LoadModuleResolveEventHandler是:

private Assembly LoadModuleResolveEventHandler(object sender, ResolveEventArgs args) 
{ 
    if (pluginDirectory != null) 
    { 
     string path = Path.Combine(pluginDirectory , "lib"); 
     if (Directory.Exists(path)) 
      foreach (string file in Directory.GetFiles(path)) 
      { 
       if (AssemblyName.GetAssemblyName(file).FullName == args.Name) 
       { 
        //Return the loaded assembly. 
        return Assembly.LoadFrom(file); 
       } 
      } 
    } 
    return null; 
} 

它使應用程序在pluginDirectory(其中插件模塊)/ lib子目錄一看,一個引用.dll,如果找到則返回。我在插件的代碼中做了類似的事情,也許你不需要......就是這樣。

另一種可能是添加到項目新項目:應用程序配置文件,並把下面的代碼:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="lib;lang" /> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

它創建application_name.exe.config文件必須與主要形式的可執行是部署和指示addicional目錄在哪裏查找程序集解析。

你可以托盤任何這些解決方案,看看他們如何工作。
此致敬禮,
mj82