【发布时间】:2010-11-27 11:23:19
【问题描述】:
我想在 .NET 3.5 中解析程序集限定名称。特别是,程序集本身不可用,它只是名称。我可以想到很多方法手动,但我想我可能会在系统库中缺少一些功能来做到这一点。有什么建议吗?
【问题讨论】:
-
这里指的是 .NET 程序集。
标签: .net parsing reflection assemblies
我想在 .NET 3.5 中解析程序集限定名称。特别是,程序集本身不可用,它只是名称。我可以想到很多方法手动,但我想我可能会在系统库中缺少一些功能来做到这一点。有什么建议吗?
【问题讨论】:
标签: .net parsing reflection assemblies
AssemblyName 类可以为您解析程序集名称,只需将字符串传递给其构造函数即可。如果你有一个程序集限定的类型名称,我认为你必须先去掉字符串的类型部分(即第一个逗号之前的所有内容)。
【讨论】:
在Mono和BNF grammar on MSDN中有一个解析器实现
【讨论】:
从 .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。
【讨论】:
Alphaleonis.Reflection.Metadata 中有一个类 TypeIdentifier(也可从 NuGet 获得),它可以解析程序集限定名称(以及完整类型名称或简单类型名称),并对其进行解构并允许对其进行修改。
【讨论】:
如果加载了程序集,您可以使用类似的东西:
Assembly assembly = Assembly.GetExecutingAssembly();
string assemblyName = assembly.GetName().Name;
在上面的示例中,我使用了一个正在执行的程序集,但您循环访问了已加载的程序集。
更新: 您始终可以在单独的 AppDomain 中加载程序集,获取程序集名称,完成后将其卸载。 如果您需要样品,请告诉我。
【讨论】: