解析装配合格的名称?

时间:2009-09-11 11:16:32

标签: .net parsing reflection assemblies

我想在.NET 3.5中解析一个程序集限定名。特别是,程序集本身不可用,它只是名称。我可以想到很多方法手工,但我想我可能会遗漏一些功能来在系统库中做到这一点。有什么建议吗?

6 个答案:

答案 0 :(得分:18)

AssemblyName类可以为你解析程序集名称,只需将字符串传递给它的构造函数即可。如果您有一个程序集限定类型名称,我认为您必须首先删除字符串的类型部分(即一切到第一个逗号)。

答案 1 :(得分:5)

从.Net 4开始,你有一个新的Type.GetType覆盖:

public static Type GetType(
    string typeName,
    Func<AssemblyName, Assembly> assemblyResolver,
    Func<Assembly, string, bool, Type> typeResolver,
    bool throwOnError,
    bool ignoreCase
)

请参阅http://msdn.microsoft.com/en-us/library/ee332784%28v=vs.100%29.aspx

您需要做的是在上述文档的示例中:

Type t2 = Type.GetType(test,
            (aName) => aName.Name == "MyAssembly" ? 
                Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : 
                Assembly.Load(aName),
            (assem, name, ignore) => assem == null ? 
                Type.GetType(name, false, ignore) : 
                assem.GetType(name, false, ignore), true
);

您可以用更复杂的函数替换上面的lambdas。

答案 2 :(得分:4)

MonoBNF grammar on MSDN

中有一个解析器实现

答案 3 :(得分:0)

Alphaleonis.Reflection.Metadata中有一个类TypeIdentifier(也可以从NuGet获得),该类可以解析程序集限定名称(以及全类型名称或简单类型名称),并对其进行解构并允许对其进行修改。

答案 4 :(得分:-1)

如果加载了程序集,你可以使用类似的东西:

    Assembly assembly = Assembly.GetExecutingAssembly();
    string assemblyName = assembly.GetName().Name;

在上面的例子中,我使用了一个正在执行的程序集,但是你遍历加载的程序集。

<强>更新 您始终可以在单独的AppDomain中加载程序集获取程序集名称,并在完成后卸载它。 如果您需要样品,请告诉我。

答案 5 :(得分:-2)

查看Path课程。它有一堆文件名解析函数。 或者你可以尝试:

string qualType = @"System.String, mscorlib, Version=2.0.0.0, Culture=neutral, publicKeyToken=b77a5c561934e089";
Type t = Type.GetType(qualType, false); 
if (t == null) 
{
   Console.WriteLine("Invalid qualified type string.");
   return;
}
Console.WriteLine(t.FullName);

所以你有类似的东西吗?

Assembly assem = Assembly.LoadFile("PathToTheAssembly.dll");
Type t = assem.GetType("Namespace.And.Type.Name");
t.FullName

如果您要解析BNF表单,上面使用GetType的示例应该适合您。

编辑:好的,这应该做你想要的,假设你有名字:

Assembly assem = Assembly.GetAssembly(Type.GetType(assembly_qualified_name, false));
if(assem != null)
{
   byte[] pkt = assem.GetName().GetPublicKeyToken();
   Version ver = assem.GetName().Version;
   CultureInfo ci = assem.GetName().CultureInfo();
}