-1

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

  • 在另一个应用程序域中
  • 从另一个文件夹
  • 有额外的依赖

我需要所有这些来加载我的第三方插件并找到一些看起来像解决方案但在这里不起作用的东西:How to Load an Assembly to AppDomain with all references recursive? 即使浏览了所有评论,我也没有设法让其中任何一个工作,我仍然在引用的程序集上得到 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 更干净。

4

1 回答 1

0

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

于 2013-05-25T03:08:14.513 回答