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