【问题标题】:How to use multiple dll versions?如何使用多个dll版本?
【发布时间】:2011-08-18 16:40:45
【问题描述】:

好的,

我这里有一个奇怪的。

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

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

我该如何处理?

我尝试压缩插件并通过 byte[] 读取程序集,但尝试加载时出错,缺少依赖 dll,所以我更进一步,将依赖 dll 添加到 zip 中并读取它们,同样错误..

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

【问题讨论】:

    标签: reflection plugins dll assemblies


    【解决方案1】:


    我最近有一个项目完全相同的问题。这是我如何解决的:
    - 为每个模块(插件)创建一个单独的目录,在里面我放了 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

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多