如何在ASP.NET Core 1.0 RC2中加载程序集

5
我将我的Web应用从ASP.NET Core RC1迁移到RC2。 我尝试加载我的引用类库。
这段代码片段在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);
            .
            .
            .
        }
    }
}

你遇到了什么类型的错误? - jeteon
没有错误……但是 app.GetService<ILibraryManager>() 返回 null。 - stevo
2个回答

12
我找到了一个解决方案。现在我使用的是 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);
    }
}

谢谢,这节省了我很多时间 :-) - Nicholas Blumhardt
谢谢!花了一段时间才弄明白。 - Charles
在我的程序中,DependencyContext.Default 解析为 null。有什么建议为什么会发生这种情况? - Nikola Schou

3
我认为stevo犯了两个错误假设:
1) 项目命名空间应该是编译库名称的一部分。 2) 编译库名称与二进制名称相同。
第一个错误发生在您在项目设置中更改它时。 第二个错误发生在project.json中指定它时。
所以你的想法是正确的,但实现是错误的。 要解决这个问题,我们需要在装配体被加载之前忘记按命名空间解析。 我想,由于所有程序集都将在任何情况下被加载,因此我们不会遇到大的性能滞后。
但这并不是万能药……程序集内可以有多个根命名空间! 因此,也许更好的方法是在程序集级别上定义某些属性,并检查它们而不是命名空间。
无论如何,如果您想通过程序集名称限制搜索范围,应该像这样进行:
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.
    }
}

这种方法稍作变化对我很有效,干杯 :) - Tagc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接