有没有办法从命名空间/类型字符串中获取Type?

时间:2010-10-11 16:22:02

标签: c# assemblies types

我需要引用外部程序集中的类型。我知道命名空间和类型名称,我知道程序集将在GAC中,但就是这样。有没有办法得到这种类型。我看到有一种方法可以从GUID或程序ID中获取它,这对我有用,但我知道开发外部程序集的人可能会偏离这些类似COM的属性。所以,我不想依赖它们。

仅仅为了参考框架,我希望我的软件在升级这个外部软件时非常通用。所以我不能依赖于某些版本的程序集。

3 个答案:

答案 0 :(得分:0)

如果它在GAC中,您可以按名称加载程序集,然后使用它迭代所有类型 Assembly.GetTypes()。您可以使用loadpartialname但不推荐使用loadpartialname来获取不具有完全限定名称的程序集。

看看Assembly.Load()
Assembly.GetType()

答案 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);
}