从另一个DLL获取Type对象的列表



我有一个使用2个自定义dll的web应用程序。一个是我在Dapper上做的一个mini-ORM,另一个是包含我所有模型类的类库。我的ORM有一个类,它在启动时运行,扫描提供的包的类型,并构建一个字段注册表供ORM使用。这个类过去与模型在同一个类库中,它可以完美地工作,因为它能够在自己的类库中找到类。自从我把它移到ORM库之后,它(可以预见地)停止工作了,因为这一行:

var types = Assembly.GetAssembly()
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));

我试着用GetEntryAssembly()代替GetAssembly(),认为调用web应用程序会封装它在模型库中发现的所有模型类,但看起来我错了。

我的问题在一个简单的是:有没有一种方法来访问类型包含在一个DLL从不同的DLL通过父web应用程序,引用两者?

是的,这是可能的,但方法取决于您的应用程序。

可以在所有加载的程序集中搜索类型

var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));

或者不是在所有程序集中搜索所有类型,而是在单个程序集中按名称

搜索
var types = AppDomain.CurrentDomain.GetAssemblies()
.Single(a => a.GetName().Name == packageName)
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));

以上代码假设程序集已经加载。

如果您知道程序集中的任何类型

var types = typeof(SomeKnownType)
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));

上面的将确保在访问程序集中的类型时已加载程序集。如果程序集尚未加载,也可以手动加载

var types = Assembly.Load(packageName)
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));

最新更新