【问题标题】:ASP.Net Core - Application Parts - prevent loading assemblies into app domainASP.Net Core - 应用程序部件 - 防止将程序集加载到应用程序域中
【发布时间】:2020-01-22 10:06:44
【问题描述】:

我有一个包含多个依赖项(模块)的 Web 应用程序,应该根据配置动态加载。出于某种原因,ASP.Net Core 将其中一些依赖项添加为 ApplicationPart,并将这些程序集加载到应用程序域中。即使我从ApplicationParts 列表中删除这些程序集,它们仍然是应用程序域的一部分并且无法卸载。有什么办法可以预防吗?

【问题讨论】:

  • “应该动态加载”是什么意思?如果 ASP.NET Core 将它们添加为应用程序部件,那么显然它们被引用并因此被加载。此外,将它们添加为应用程序部件意味着控制器。查看组件,发现标签助手(如果没有加载它们就不会发生)。
  • @AlexanderChristov 我的意思是有一个基于 appsettings.json 加载程序集的代码(使用Assembly.Load)。问题是在services.AddMvc 之后,甚至未使用的程序集也会被加载,因为它们位于bin 文件夹中。因此,在此方法之前AppDomain.GetAssemblies 给出了一个较小的程序集列表,之后它显示加载了几个额外的程序集。不仅是 ASP.Net Core 程序集,还有我不应该一次加载的自定义程序集
  • 因此,请使用专用的“模块”文件夹。例如,它可能位于您的应用程序根文件夹中。这将允许更好地控制加载的内容和原因。
  • 是的,这是一个选项,但在这种情况下,我需要一些构建后步骤将程序集移出 bin 文件夹

标签: c# .net asp.net-core .net-core appdomain


【解决方案1】:

您可以使用以下代码删除 ApplicationParts,请尝试并告诉我。

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .ConfigureApplicationPartManager(o =>
        {
            o.ApplicationParts.Clear();
            o.ApplicationParts.Add(new AssemblyPart(typeof(Startup).Assembly);
        });
}

【讨论】:

  • 不,正如我所说,即使我从 ApplicationParts 列表中删除这些程序集,它们仍然是应用程序域的一部分并且无法卸载
  • @Random 你能把代码放上来吗,你在用吗?
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多