【问题标题】:Assembly.LoadFrom and dependenciesAssembly.LoadFrom 和依赖项
【发布时间】:2018-08-07 15:44:03
【问题描述】:

我一直在尝试使用 Assembly.LoadFrom() 设置插件系统,该插件系统在 .exe 目录的子文件夹中动态加载 dll。

我有一个 .exe 和插件都引用的接口库。 构建完成后,我将插件 dll 复制到子文件夹。

不同的插件可能有共同的库,所以我想在 .exe 旁边收集这些依赖项。

我的理解是我必须使用 AssemblyResolve 事件从 exe 的目录中手动加载插件依赖项。这个对吗 ?因为它看起来很麻烦。

【问题讨论】:

    标签: c# .net-assembly


    【解决方案1】:

    在您的情况下,您有两种可能的情况:

    1- 您的 Exe 和您的插件共享一个引用:在这种情况下,共享引用已由 Exe 加载,您无需担心加载它。即使您尝试再次加载它,因为它已经存在于加载的程序集中,它也不会再次加载。

    2- 你的 Exe 没有引用插件引用的库。在这种情况下,如果库程序集存在于您的子文件夹中并且您使用 LoadFrom 它应该尝试为您加载依赖程序集。现在,尽管您的应用程序启动路径是 Exe 的目录,但如果您从插件直接引用库,我认为程序集解析不会失败。但是,如果由于某种原因确实失败了,.Net 框架有AssemblyResolve 来帮助您。您只需订阅该事件并让它搜索库的正确路径(子文件夹)。

    其实并不麻烦。它只是订阅一个事件。像这样的:

    private static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
    {
        //The name would contain versioning and other information. Let's say you want to load by name.
        string dllName = e.Name.Split(new[] { ',' })[0] + ".dll";
        return Assembly.LoadFrom(Path.Combine([AssemblyDirectory], dllName));
    }
    

    【讨论】:

    • 通过使用 ResolveAssembly,我注意到它从不尝试解析使我的代码引发 DllNotFoundException 的程序集。但是,我通过使用 AssemblyLoad 发现丢失的 dll 实际上已正确加载。但我仍然有同样的问题。
    • 其实我刚刚意识到丢失的 dll 不是程序集。这是我的一个程序集正在包装的本机 dll。
    • @AdrianGoudard 然后包装器应该使用LoadLibrary winApi 而不是DllImport 如果它正在使用它。
    • 订阅活动解决了我的问题。我试图从插件文件夹加载插件,但依赖项需要位于不同的文件夹中,以便插件文件夹中只有插件程序集。
    【解决方案2】:

    您可以注册到AssemblyResolve 事件,该事件将在 CLR 无法加载依赖项时触发,或者您可以使用 app.config 中的 <probing> 元素来指示 CLR 在这些目录中查找为好吧:

    来自MSDN

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <probing privatePath="bin;bin2\subbin;bin3"/>
          </assemblyBinding>
       </runtime>
    </configuration>
    

    【讨论】:

      【解决方案3】:

      使用 ProcMon.exe 解决。 丢失的 dll 实际上已正确加载。但它也有我没有复制到 exe 文件夹的依赖项。 DllNotFoundException 的消息令人困惑,因为它没有报告丢失的 dll,而是报告了失败的 dll。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        相关资源
        最近更新 更多