2009-12-02 55 views
4

我有一个类型的程序集限定名,例如如何从程序集的限定名称中提取程序集全名?

MyNamespace.MyClass,MyAssembly程序, 版本= 1.0.0.0,文化=中立, 公钥=空

我想提取组装的全名,即

MyAssembly程序,Version = 1.0.0.0, Culture = neutral,PublicKeyToken = null

很明显,我可以用简单的字符串解析来做到这一点,但有没有一个框架方法来做到这一点?

注:我没有类型或程序集,只是字符串,这是问题的重要部分,所以myType.AssemblyQualifiedName,myType.Assembly.FullName等不会帮助

回答

1

这里:

public string AssemblyName(string assemblyQualifiedName) { 
    Type type = Type.GetType(assemblyQualifiedName, false); 
    if(type == null) { 
     return Parse(assemblyQualifiedName); 
    } 
    return type.Assembly.Name; 
} 

编辑:等待。你没有装配?对不起,成为坏消息的持有者,但你需要解析。

+0

不幸的是我的应用程序将无法获得实际的类型对我来说,那时的我,不得不进行解析... –

+0

@保罗ķ调用的GetType:是的,如果你没有装配那么你需要解析字符串。由于CLR无法找到该类型的元数据以进行反射,因此反射等无法帮助您。我尽量避免质疑动机,但在这里解析有什么问题? – jason

+0

@Jason,thx为您的输入...解析没有问题,如果这是我不得不诉诸于,但FQN可以涉及(MSDN“指定完全限定的类型名称”),我只是一个公开暴露的框架解决方案可能存在,因为它必须在内部解析这些东西...... –

0

如果您想使用GetType,您需要将程序集加载到当前域。你可以学习如何去做here

虽然这似乎是一个大量的工作,只是为了避免琐碎的解析......

2

overloadType.GetType接受可用于将AssemblyName解析为一个组装的功能。返回null通常会抛出异常,因为该类型无法解析,但可以通过将false传递给throwOnError参数来抑制此类异常。

用于解析的函数也可以在原始代码将返回的外部作用域中设置一个字符串变量。

using System; 
using System.Diagnostics; 
using System.Reflection; 

namespace ConsoleApp { 
    public static class Program { 
     public static void Main() { 
      var assemblyName = GetAssemblyName("MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
      Debug.Assert(assemblyName == "MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 
     } 

     public static String GetAssemblyName(String typeName) { 
      String assemblyName = null; 
      Func<AssemblyName, Assembly> assemblyResolver = name => { 
       assemblyName = name.FullName; 
       return null; 
      }; 

      var type = Type.GetType(typeName, assemblyResolver, null, false); 
      if (type != null) 
       return type.AssemblyQualifiedName; 

      return assemblyName; 
     } 
    } 
} 
相关问题