首页 > 解决方案 > 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 中包含的类型?

标签: c#dlltypesreflection.net-assembly

解决方案


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

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

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));

推荐阅读