从具有依赖关系的另一个文件夹加载另一个应用程序域中的程序集

Posted

技术标签:

【中文标题】从具有依赖关系的另一个文件夹加载另一个应用程序域中的程序集【英文标题】:Loading assembly in another appdomain from another folder with dependencies 【发布时间】:2013-05-22 17:01:29 【问题描述】:

我发现了这个问题的一些变体,但是当你想要加载你的程序集时,混合所有这些标准似乎会产生它自己的一组错误

在另一个应用程序域中 从另一个文件夹 附加依赖项

我需要所有这些来加载我的第三方插件并找到一些看起来像解决方案但在这里不起作用的东西:How to Load an Assembly to AppDomain with all references recursively? 即使通过所有的 cmets,我也没有设法让其中任何一个工作,我仍然在引用的程序集上遇到 FileNotFoundExceptions。 但是,我在其中一个 cmets 中找到了一个可以满足我需求的框架:https://github.com/jduv/AppDomainToolkit 但这似乎也不起作用,这是我在这个框架中使用的示例代码,但我仍然得到一个找不到文件的异常

var uploadedPluginsDirectories = new DirectoryInfo(Path.Combine(Directory.GetCurrentDirectory(),"UploadedModules"));
foreach(var uploadedPluginsDirectory in uploadedPluginsDirectories.GetDirectories())

    foreach (var pluginFile in uploadedPluginsDirectory.GetFiles("*.dll")
        .Where(f=>f.Name == "DeepSearch.Modules.Excel.Graphs.dll"))
    
        var context = AppDomainContext.Create();
        int Count = context.Domain.GetAssemblies().Count();
        context.RemoteResolver.AddProbePath(pluginFile.Directory.FullName);
        var load = context.LoadAssemblyWithReferences(LoadMethod.LoadFrom, pluginFile.FullName); 
        // This crashes complaining about FileNotFoundException on one of the assemblies referenced by the one i'm trying to load, they both are in pluginFile.Directory.FullName
        Count = context.Domain.GetAssemblies().Count();
        Count.ToString();
    

编辑:为了澄清 cmets 的要求,我正在寻求帮助以使 sn-p 正常工作,如上所述,我遇到了一个例外,我只提到了我之前尝试列出的选项对我来说失败了,但我正在寻求帮助,而不是以前的选项,因为这似乎比自己使用 AppDomain 和远程 API 更干净。

【问题讨论】:

-1:到目前为止,该帖子缺少任何类型的问题。 “似乎不起作用”既不是对问题的详细解释,也不是疑问。 +1 阿列克谢! @Ronan:请提出一个问题,我们可以帮助您解决问题... 你好,不工作意味着我放弃了它,我想要的是让框架工作,如果不清楚,很抱歉,但我的问题是我如何让我粘贴的代码在没有的情况下工作我得到的例外,在我看来,它应该按照文档和单元测试的方式工作 实际上 -1 是不值得的,正如我在代码注释中所问的那样,但我看到发生了什么,它滚动过去的视图:( 现在修复格式,问题是关于代码中的异常(在哪里评论是) 【参考方案1】:

好吧,我终于找到了罪魁祸首。 由于我在域上调用 GetAssemblies,它同时将它们加载到 AppDomain(调用解析器)和我当前的根域中(它也需要加载程序集,因为它获取程序集对象作为 GetAssemblies 的返回) 为了解决这个问题,我必须在本地和远程域上设置解析器,但是这是一个坏主意,因为它消除了加载另一个 AppDomain 的隔离优势,所以我决定不调用 GetAssemblies 并在 Child 上进行反射工作域并将结果返回到原始域。

【讨论】:

嗨,Ronan,我是 AppDomainToolkit 的作者——我很想了解更多关于您无法用它解决的问题。我将尝试使用上述场景,看看我是否可以重现它,如果可以的话,我希望改进 ADT,这样其他人就不会遇到同样的问题。如果您有任何其他信息需要传递,请通过我的 Twitter 联系我。给您添麻烦了!

以上是关于从具有依赖关系的另一个文件夹加载另一个应用程序域中的程序集的主要内容,如果未能解决你的问题,请参考以下文章

解析 IP 并将其连接到 BigQuery 上具有一系列整数表示的另一个表

将数据从一个表加载到配置单元中的另一个表

从具有多个条目的另一个表更新MYSQL

如何从xml中的另一个包加载资源?

从具有不同于默认值的另一个 swf 中打开一个 swf 文件

如何根据具有外键关系的另一个模型更新 Django 模型的字段