好的,如何使用多個dll版本?
我在這裏有一個奇怪的。
我們目前有一個工具應用程序,它允許我們創建插件,這些插件只是帶有用戶控件的DLL,我只需使用Assembly.Load加載並創建新實例,添加到面板即可使用。
但是,插件可能包含第三方dll。
我該如何處理?
我試過壓縮插件並通過字節[]閱讀程序集,但是在嘗試加載時,出現錯誤,缺少依賴的dll,所以我甚至進一步將依賴的dll添加到zip中並讀取它們,同樣的錯誤..
也許我可以創建一個與依賴dll插件名稱的文件夾?
好的,如何使用多個dll版本?
我在這裏有一個奇怪的。
我們目前有一個工具應用程序,它允許我們創建插件,這些插件只是帶有用戶控件的DLL,我只需使用Assembly.Load加載並創建新實例,添加到面板即可使用。
但是,插件可能包含第三方dll。
我該如何處理?
我試過壓縮插件並通過字節[]閱讀程序集,但是在嘗試加載時,出現錯誤,缺少依賴的dll,所以我甚至進一步將依賴的dll添加到zip中並讀取它們,同樣的錯誤..
也許我可以創建一個與依賴dll插件名稱的文件夾?
我最近有一個完全相同的問題的項目。下面是我如何解決它:
- 爲每個模塊(插件)創建一個單獨的目錄,裏面我把主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