c# - c# - 从另一个 DLL 获取 Type 对象的列表
问题描述
我有一个使用 2 个自定义 DLL 的网络应用程序。一个是我在 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 应用程序会封装它在模型库中找到的所有模型类,但看起来我错了。
简而言之,我的问题是:有没有办法通过引用两者的父 Web 应用程序从不同的 DLL 访问 DLL 中包含的类型?
解决方案
是的,这是可能的,但方式取决于您的应用程序。
您可以在所有加载的程序集中搜索类型
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));
推荐阅读
- python - Scrapy - 如何在使用脚本启动蜘蛛时加载项目级别的 settings.py
- java - 如果选中 JCheckbox,则更新 JTable 中的 JProgressbar
- angular - Click 事件未在 Angular 2 中使用的数据表的每一行的按钮上触发
- javascript - 如何在 HTML 表单中获取数据输入的时间戳
- postgresql - 连续统计postgresql数据
- node.js - node.js i18n - 无法读取未定义的属性“toLowerCase”
- php - 限制 wordpress 用户对文件夹和 php 文件的访问
- azure-iot-hub - 尝试使用自己的 x509 证书运行 azure-iot-sdk-java provisioning-x509-sample
- wso2 - 服务器 wso2 没有响应
- vb.net - 从位图寻路