我正在尝试编写一些逻辑来镜像原始.NET应用程序中的一些现有逻辑。在我的JMenuItem
方法中,我想在加载的程序集中加载所有当前类型,以找到需要在模型中注册实体类型配置的类型。
这是在.NET中使用JMenu
完成的,但.NET Core中不再存在OnModelCreating()
。
有没有新方法可以做到这一点?
我在网上看到了一些使用AppDomain.CurrentDomain.GetAssemblies().Select(a => a.GetTypes())
的例子,但AppDomain
似乎不再存在。
修改
我现在发现将DependencyContext.Default.RuntimeLibraries
添加到DependencyContext.Default
项目可行。但是我实际上正在编写一个包含多个项目的解决方案,我不知何故需要在我的Microsoft.Extensions.DependencyModel
项目中进行此类型加载,其中我的DbContext实现和实体类型配置是
答案 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"));
}
}