我需要引用外部程序集中的类型。我知道命名空间和类型名称,我知道程序集将在GAC中,但就是这样。有没有办法得到这种类型。我看到有一种方法可以从GUID或程序ID中获取它,这对我有用,但我知道开发外部程序集的人可能会偏离这些类似COM的属性。所以,我不想依赖它们。
仅仅为了参考框架,我希望我的软件在升级这个外部软件时非常通用。所以我不能依赖于某些版本的程序集。
答案 0 :(得分:0)
如果它在GAC中,您可以按名称加载程序集,然后使用它迭代所有类型 Assembly.GetTypes()。您可以使用loadpartialname但不推荐使用loadpartialname来获取不具有完全限定名称的程序集。
答案 1 :(得分:0)
由于您知道这可以保证在GAC中,因此您可以列出gacutil /l
的结果。这将为您提供GAC中每个程序集的列表。
由此,您可以启动执行以下操作的循环:
foreach assemblyName in list
Create new AppDomain
Load assembly into new appdomain
check for type in assembly
if exists:
return assemblyName to main appDomain
Unload appdomain
在单独的AppDomain中执行此操作非常重要,或者您将所有这些程序集永久加载到您的程序中。
请注意,这将是非常非常慢的,并不完全是我推荐的内容。一旦知道了正确的类型名称,就应该将其缓存在应用程序设置中以备将来加载。
编辑:
正如Hans所指出的,Gacutil需要使用.NET SDK安装。如果这不是有效选项,则可以使用C ++ / CLI创建.NET可访问API以从GAC检索信息。有Native API for accessing GAC information,但这不是托管API。
答案 2 :(得分:0)
你知道装配名还是不知道?
如果你知道assembylname比它容易:
Object Creator(string assemblyname, string classname)
{
System.Type objType = System.Type.GetType(assemblyname + "." + classname);
Return Activator.CreateInstance(objType);
}