我最近有一个项目完全相同的问题。这是我如何解决的:
- 为每个模块(插件)创建一个单独的目录,在里面我放了 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,如果找到则返回它。我在插件的代码中做了类似的事情,也许你不必......就是这样。
另一种可能是在项目中添加新项目:应用程序配置文件,并将代码放在下面:
<?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 文件,该文件必须与主窗体可执行文件一起部署,并指示在哪里寻找程序集解析的附加目录。
您可以盘点这些解决方案中的任何一个,看看它们是如何工作的。
最好的问候,
mj82