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