子 AppDomain (.Net) 中的后期绑定

Posted

技术标签:

【中文标题】子 AppDomain (.Net) 中的后期绑定【英文标题】:Late binding in child AppDomain (.Net) 【发布时间】:2010-10-01 02:41:46 【问题描述】:

我正在尝试在 .Net 中开发插件架构。该应用程序将是一个 .Net 应用程序。会有包含插件的目录。每个目录将代表一个插件。每个插件目录也将包含所有依赖 dll。插件需要存储在单独的 AppDomain 中,因为插件可能使用相同的程序集,但版本不同。

当它遍历 Init() 中的 foreach 循环时,我得到一个 System.IO.FileNotFoundException:无法加载文件或程序集“[程序集名称],版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。 在 _apDomain.Load() 中用于不在主项目中的程序集。

代码:

    readonly private AppDomain _appDomain;
    internal ItemModuleAppDomain()
    
        AppDomainSetup info = AppDomain.CurrentDomain.SetupInformation;
        _appDomain = AppDomain.CreateDomain("ChildDomain");
    

    public void Init(string dllDir)
    
        string[] dlls = Directory.GetFiles(dllDir, "*.dll", SearchOption.TopDirectoryOnly);
        foreach(string dll in dlls)
        
            _appDomain.Load(AssemblyName.GetAssemblyName(dll));
        

知道为什么吗?我尝试了几种方法,例如将程序集读取为要加载的字节数组。

【问题讨论】:

【参考方案1】:

我相信AppDomain.Load 可能是您的目的的错误方法 - 它将程序集加载到当前应用程序域和目标域中。你会得到一个错误,因为你的程序集位于一个子文件夹中,而 .NET 不知道它。您必须在配置中提供私有路径 (http://msdn.microsoft.com/en-us/library/15hyw9x3.aspx)。也可以使用AppDomain的AssemblyResolve或TypeResolve事件进行解析。

您还应该查看 AppDomain.CreateInstanceFrom 方法来加载您的主要插件类型(和包含程序集)。

【讨论】:

谢谢。我们最终对 dll 进行了严格命名,以便将它们加载到同一个 AppDomain 中。

以上是关于子 AppDomain (.Net) 中的后期绑定的主要内容,如果未能解决你的问题,请参考以下文章

.net CLR 在 VBA (Access) 中的后期绑定

是否可以从另一个单独的 .NET AppDomain 更改 .NET AppDomain 中的字符串属性的值

如何从 .NET 对 .NET 中定义的 COM 对象执行后期绑定调用(通过 DispID)?

替换 Net Core 中的 AppDomain

在 ASP.NET 中的其他 AppDomain 中运行应用程序

当实例缺少公共构造函数时,有啥方法可以从 .NET 中的 AppDomain 创建实例?