【问题标题】:How to load assemblies in ASP.NET Core 1.0 RC2如何在 ASP.NET Core 1.0 RC2 中加载程序集
【发布时间】:2016-05-19 06:28:44
【问题描述】:

我正在将我的 Web 应用程序从 ASP.NET Core RC1 迁移到 RC2。我正在尝试加载我引用的类库。

此代码 sn-p 不再适用于 RC2:

public class Startup
{  
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        // libraryManager is null .... 
        ILibraryManager libraryManager = app.GetService<ILibraryManager>();

        List<Assembly> result = new List<Assembly>();

        IEnumerable<Library> libraries = libraryManager.GetLibraries();

        IEnumerable<AssemblyName> assemblyNames = libraries.SelectMany(e => e.Assemblies).Distinct();
        assemblyNames = Enumerable.Where(assemblyNames, e => e.Name.StartsWith("projectNamespace"));

        foreach (AssemblyName assemblyName in assemblyNames)
        {
            Assembly assembly = Assembly.Load(assemblyName);
            .
            .
            .
        }
    }
}

【问题讨论】:

  • 你遇到什么样的错误?
  • 没有错误.... 但是 app.GetService() 返回 null

标签: c# asp.net .net coreclr


【解决方案1】:

我找到了解决方案。我现在使用DependencyContext 而不是ILibraryManager

var loadableAssemblies = new List<Assembly>();

var deps = DependencyContext.Default;            
foreach (var compilationLibrary in deps.CompileLibraries)
{
    if (compilationLibrary.Name.Contains(projectNamespace))
    {
        var assembly = Assembly.Load(new AssemblyName(compilationLibrary.Name));
        loadableAssemblies.Add(assembly);
    }
}

【讨论】:

  • 谢谢,为我节省了很多时间 :-)
  • 谢谢!花了一段时间才弄清楚。
  • 在我的程序中 DependencyContext.Default 解析为 null。有什么建议为什么会发生这种情况?
【解决方案2】:

我认为 stevo 做了两个错误的假设:

1) 该项目命名空间应该是编译库名称的一部分。
2) 编译库名与二进制名相同。

在项目设置中更改第一个是错误的。 在 project.json 的 buildOptions 中指定第二个是错误的。

所以你的想法是正确的,但实施是错误的。 为了解决这个问题,我们需要忘记在加载程序集之前按名称空间解析。
我想因为无论如何都会加载所有程序集,所以我们不会有很大的性能延迟。

但这不是灵丹妙药……程序集内部可以有多个根命名空间! 所以也许更好的方法是在程序集级别定义一些属性并检查它而不是命名空间。

在任何情况下,如果您想通过程序集名称来限制搜索,则应该这样:

IEnumerable<AssemblyName> names = DependencyContext.Default.GetDefaultAssemblyNames();

foreach (AssemblyName name in names)
{
    if (name.Name.StartsWith("MyRoot") == true)
    {
        Assembly assembly = Assembly.Load(name);

        // Process assembly here...
        // I will check attribute for each loaded assembly found in MyRoot.
    }
}

【讨论】:

  • 这种方法的细微变化对我有用,干杯。 :)
猜你喜欢
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 2016-10-28
  • 2016-06-27
  • 2016-09-14
  • 2017-11-16
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多