另一个答案显示了获取(在运行时)可能未加载的Type
定义的最佳方法:Assembly
var T1 = Type.GetType("System.Web.Configuration.IAssemblyCache, " +
"System.Web, " +
"Version=4.0.0.0, " +
"Culture=neutral, " +
"PublicKeyToken=b03f5f7f11d50a3a");
如您所见,不幸的是,该方法要求您提供完整的AssemblyQualifiedName,Type
并且不适用于我尝试过的任何程序集名称的缩写形式。这在某种程度上违背了我们在这里的主要目的。如果您知道有关程序集的很多细节,那么自己加载它就不会那么困难了:
var T2 = Assembly.Load("System.Web, " +
"Version=4.0.0.0, " +
"Culture=neutral, " +
"PublicKeyToken=b03f5f7f11d50a3a")
.GetType("System.Web.Configuration.IAssemblyCache");
尽管这两个示例看起来很相似,但它们执行的代码路径却截然不同;请注意,例如,后一个版本调用实例重载Assembly.GetType
与静态调用Type.GetType
。因此,第二个版本可能更快或更高效。但是,无论哪种方式,您似乎最终都会使用以下 CLR 内部方法,并且第二个参数设置为false
,这就是为什么这两种方法都不会麻烦地代表您搜索所需的程序集。
[System.Runtime.Remoting.RemotingServices]
私有静态 RuntimeType LoadClrTypeWithPartialBindFallback (
String typeName,
bool partialFallback);
从这些不便中向前迈出的一小步是自己调用此 CLR 方法,但partialFallback
参数设置为true。在这种模式下,函数将接受 的截断版本,AssemblyQualifiedName
并根据需要定位并加载相关程序集:
static Func<String, bool, TypeInfo> LoadClrTypeWithPartialBindFallback =
typeof(RemotingServices)
.GetMethod("LoadClrTypeWithPartialBindFallback", (BindingFlags)0x28)
.CreateDelegate(typeof(Func<String, bool, TypeInfo>))
as Func<String, bool, TypeInfo>;
// ...
var T3 = LoadClrTypeWithPartialBindFallback(
"System.Web.Configuration.IAssemblyCache, System.Web",
true); // <-- enables searching for the assembly
这如图所示,并且还继续支持AssemblyQualifiedName
在前面的示例中指定完整。这是一个小的改进,但它仍然不是完全不合格的命名空间搜索,因为您仍然必须指定程序集的短名称,即使它可能是从出现在类型名称本身中的命名空间推导出来的。