我有一个使用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));