在单独的AppDomain中加载ASP.NET Web API插件程序集

时间:2016-05-04 10:39:25

标签: c# .net asp.net-mvc asp.net-web-api .net-assembly

我正在MVC下创建类似CMS的应用程序。

要处理插件的后端代码我使用Web API,因此将我的API DLL放在/ bin文件夹中使我能够通过特定路径访问插件服务方法 - /api/{namespace}/{controller}/{id}

我想从其他位置加载程序集,然后在新模块安装/升级/删除的情况下卸载它们。

人们建议覆盖DefaultAssembliesResolver以包含插件程序集:

public class PluginAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        List<Assembly> assemblies = new List<Assembly>(base.GetAssemblies());

        foreach (string assemblyPath in ModuleManager.GetAllAssemblyPaths(HttpContext.Current.Server))
        {
            if (File.Exists(assemblyPath))
            {
                assemblies.Add(Assembly.LoadFrom(assemblyPath));
            }
        }

        return assemblies;
    }
}

但在这种情况下,我将程序集加载到当前域中,我无法卸载它们。

尝试从其他位置加载程序集会引发错误(它识别我的程序集,但尝试在/bin/bin/myPlugin文件夹下查找相同的DLL):

AppDomain domain = AppDomain.CreateDomain("myDomain", null);     

Assembly assembly = Assembly.LoadFrom(@"C:\myPluginPath\myPlugin.dll");

domain.Load(assembly.GetName());

如何将它们加载到单独的AppDomain中?

谢谢。

2 个答案:

答案 0 :(得分:1)

您需要覆盖DefaultHttpControllerSelector。  这是一篇关于这个主题的非常好的文章:link 希望这有帮助

答案 1 :(得分:0)

尝试create table like 也许这有帮助。 我对类似的应用感兴趣。我正在尝试找到一种方法在不同的应用程序域中加载它们并使其工作。我正在通过Microsoft Addin Framework加载我的DLL,它允许我将插件加载到不同的appDomains中,以便在运行时卸载它们。但是,我不确定ASP WebAPI是否以及如何处理多堆ApplicationDomains。应用程序域限制两个DLL之间的通信。您使用的是一个ASP WebApi服务器还是创建了