在.NET Core中替换AppDomain.GetLoadedAssemblies()?

时间:2017-05-14 15:40:43

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

我正在尝试编写一些逻辑来镜像原始.NET应用程序中的一些现有逻辑。在我的JMenuItem方法中,我想在加载的程序集中加载所有当前类型,以找到需要在模型中注册实体类型配置的类型。

这是在.NET中使用JMenu完成的,但.NET Core中不再存在OnModelCreating()

有没有新方法可以做到这一点?

我在网上看到了一些使用AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetTypes())的例子,但AppDomain似乎不再存在。

修改

我现在发现将DependencyContext.Default.RuntimeLibraries添加到DependencyContext.Default项目可行。但是我实际上正在编写一个包含多个项目的解决方案,我不知何故需要在我的Microsoft.Extensions.DependencyModel项目中进行此类型加载,其中我的DbContext实现和实体类型配置是

2 个答案:

答案 0 :(得分:5)

通过将.netstandard项目从1.4升级到1.6来解决此问题。包Microsoft.Extensions.DependencyModel 1.1.2现在有效。

修改

使用.netstandard2.0删除了对AppDomain polyfill类的需求,因为它包含更多.NET API,包括System.AppDomain

答案 1 :(得分:4)

您正在寻找的内容得到广泛解释here。 Autor建议创建polyfill。

如果页面丢失,我将复制粘贴。

public class AppDomain
{
    public static AppDomain CurrentDomain { get; private set; }

    static AppDomain()
    {
        CurrentDomain = new AppDomain();
    }

    public Assembly[] GetAssemblies()
    {
        var assemblies = new List<Assembly>();
        var dependencies = DependencyContext.Default.RuntimeLibraries;
        foreach (var library in dependencies)
        {
            if (IsCandidateCompilationLibrary(library))
            {
                var assembly = Assembly.Load(new AssemblyName(library.Name));
                assemblies.Add(assembly);
            }
        }
        return assemblies.ToArray();
    }

    private static bool IsCandidateCompilationLibrary(RuntimeLibrary compilationLibrary)
    {
        return compilationLibrary.Name == ("Specify")
            || compilationLibrary.Dependencies.Any(d => d.Name.StartsWith("Specify"));
    }
}