如何使用多个DLL版本?

时间:2011-05-04 16:14:12

标签: reflection plugins dll assemblies

好的,

我这里有一个奇怪的人。

我们目前有一个工具应用程序允许我们创建插件,这些插件只是带有usercontrols的DLL,我只是使用Assembly.Load加载并创建新实例,添加到要使用的面板。

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

我该如何处理?

我已经尝试过压缩插件并通过byte []读取程序集,但是在尝试加载时遇到错误,缺少相关的dll,所以我走得更远,将依赖的dll添加到zip中并读取它们,同样的误差..

也许我可以创建一个带有依赖dll的插件名称的文件夹?

1 个答案:

答案 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