.net - 插件 AppDomains 解决方法

标签 .net plugins appdomain appdomainsetup

在处理它们自己的子目录中的插件程序集时,有一个众所周知的问题,即这些程序集一旦尝试从其子目录加载它们各自的依赖项,就无法加载。一种解决方案是在 AppDomains 中加载具有 PrivateBinPath 的插件。设置在他们的AppDomainSetup初始化时的对象。但是,这会导致有关编码/跨 AppDomain 通信的其他困难,特别是如果插件应该提供一些 GUI。

当安全方面的优先级较低时(非关键实用程序应用程序,由于错误插件导致的崩溃没有严重问题),我有以下想法:在应用程序启动时,应搜索所有插件目录,并新建一个应创建 AppDomain,在其 bin 路径中包含这些目录。然后,整个应用程序及其 GUI 与所有插件一起在新的 AppDomain 中运行。

在给定的情况下,是否有任何理由避免该解决方案?或者是否有任何原因导致该解决方案甚至不可行?

最佳答案

考虑到您描述的场景,我不知道与您的第二个域提案相关的任何问题。但是,您也可以通过搜索自己的插件子目录并使用 Assembly.LoadFrom 从那里加载程序集来研究在初始域上处理程序集加载失败的可能性。 .

可能的设置示例,其中 FindAssemblyByName必须实现以搜索所有可能的位置:

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

    // ...
}

static Assembly CurrentDomain_AssemblyResolve(
    object sender, 
    ResolveEventArgs e)
{
    var assemblyName = new AssemblyName(e.Name);

    string assemblyFilePath = FindAssemblyByName(assemblyName);

    if (string.IsNullOrEmpty(assemblyFilePath))
        return null;

    return Assembly.LoadFrom(assemblyFilePath);
}

关于.net - 插件 AppDomains 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923727/

相关文章:

.net - Windbg 中的 WaitForMultipleObjects 是否表明 .NET 应用程序中的事件存在问题?

android - 开发 Ionic/Cordova 插件 - 插件无法构建

MYSQL密码问题

c# - 从 C# 中的 dll 加载特定类

c# - 如何在 Inno Setup 中使用数据库为 .NET 应用程序制作安装文件?

c# - 多个ActionFilterAttribute的执行顺序有保证吗?

java - 无法安装打包为 eclipse 更新站点的 eclipse 插件

c# - 如何强制 MSTEST TestMethod 在运行前重置所有单例/静态?

caSTLe-windsor - 我可以告诉 CaSTLe Windsor 在单独的 AppDomain 中创建组件吗?

.net - 托管 C++ 程序集属性