c# - 从另一个 DLL 获取类型对象的列表
c# - Get a list of Type objects from another DLL
我有一个使用 2 个自定义 DLL 的网络应用程序。一个是我在 Dapper 上制作的迷你 ORM,另一个是 class 库,其中包含我所有的模型 classes。我的 ORM 有一个 class 在启动时运行,扫描提供的包的类型并构建一个字段注册表供 ORM 使用。这个 class 曾经与模型在同一个 class 库中,它工作得很好,因为它能够在它自己的 class 库中找到 classes。自从我将它移到 ORM 库后,它(可以预见地)因为这一行而停止工作:
var types = Assembly.GetAssembly()
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));
我尝试用 GetEntryAssembly() 替换 GetAssembly(),认为调用 Web 应用程序会封装它在模型库中找到的所有模型 classes,但看起来我错了。
简而言之,我的问题是:有没有办法通过引用两者的父 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));
我有一个使用 2 个自定义 DLL 的网络应用程序。一个是我在 Dapper 上制作的迷你 ORM,另一个是 class 库,其中包含我所有的模型 classes。我的 ORM 有一个 class 在启动时运行,扫描提供的包的类型并构建一个字段注册表供 ORM 使用。这个 class 曾经与模型在同一个 class 库中,它工作得很好,因为它能够在它自己的 class 库中找到 classes。自从我将它移到 ORM 库后,它(可以预见地)因为这一行而停止工作:
var types = Assembly.GetAssembly()
.GetTypes()
.Where(t => t.IsClass)
.Where(t => t.Namespace != null)
.Where(t => t.Namespace.StartsWith(packageName));
我尝试用 GetEntryAssembly() 替换 GetAssembly(),认为调用 Web 应用程序会封装它在模型库中找到的所有模型 classes,但看起来我错了。
简而言之,我的问题是:有没有办法通过引用两者的父 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));