从另一个具有依赖项的文件夹中将程序集装入另一个appdomain

时间:2013-05-22 17:01:30

标签: c# .net reflection marshalling appdomain

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

  • 在另一个appdomain
  • 来自其他文件夹
  • 使用其他依赖项

我需要所有这些来加载我的第三方插件并找到一些看起来像解决方案但在这里不起作用的东西:How to Load an Assembly to AppDomain with all references recursively? 我没有设法让任何这个工作,甚至通过所有的评论我仍然最终与引用的程序集上的FileNotFoundExceptions。 但是我找到了一个可以满足我的需求的框架: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();
    }
}

编辑:为了澄清所要求的评论,我正在寻求帮助以使代码段工作,如上所述,我得到一个例外,我只提到我之前尝试过的列出失败的选项我,但我正在寻求这方面的帮助,而不是以前的选项,因为这似乎比使用AppDomain&我自己远程处理API。

1 个答案:

答案 0 :(得分:0)

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