好的,
我这里有一个奇怪的人。
我们目前有一个工具应用程序允许我们创建插件,这些插件只是带有usercontrols的DLL,我只是使用Assembly.Load加载并创建新实例,添加到要使用的面板。
但是插件可能包含第三方dll。
我该如何处理?
我已经尝试过压缩插件并通过byte []读取程序集,但是在尝试加载时遇到错误,缺少相关的dll,所以我走得更远,将依赖的dll添加到zip中并读取它们,同样的误差..
也许我可以创建一个带有依赖dll的插件名称的文件夹?
答案 0 :(得分:0)
我最近有一个项目有完全相同的问题。这是我如何解决它:
- 为每个模块(插件)创建一个单独的目录,在我把main 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,如果找到则返回它。我在插件的代码中做了类似的事情,也许你不必......就是这样。
其他可能性是向项目添加新项目:Application Configuration File,并将代码放在下面:
<?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