说我有这么一点代码:
public static void LoadSomething(Type t)
{
var t1 = Type.GetType(t.AssemblyQualifiedName);
var t2 = t
.Assembly
.GetTypes()
.First(ta => ta.AssemblyQualifiedName == t.AssemblyQualifiedName);
}
t1是 null ,t2是非空。我很困惑,因为如果我这样称呼它......
LoadSomething(typeof(SomeObject));
然后 都不是null,但我实际上做的更像是这样(不是真的,这是大规模简化,但它说明了我的观点):
LoadSomething(Assembly.LoadFile(@"C:\....dll").GetTypes().First());
所以问题的第一部分(供我参考)是......
在第二种情况下,由于必须加载程序集并且我找到了它的类型,为什么Type.GetType
返回null?
其次(实际解决我的问题)......
当我只将汇编限定名称作为字符串(我之前已经使用Assembly.Load方法加载)时,是否还有其他方法可以加载类型?
答案 0 :(得分:20)
当我只有一个类型的时候,还有其他方法可以加载一个类型 汇编限定名称作为字符串(我以前知道 使用Assembly.Load方法加载??
是。允许有GetType
重载。它需要一个“程序集解析器”函数作为参数:
public static Type LoadSomething(string assemblyQualifiedName)
{
// This will return null
// Just here to test that the simple GetType overload can't return the actual type
var t0 = Type.GetType(assemblyQualifiedName);
// Throws exception is type was not found
return Type.GetType(
assemblyQualifiedName,
(name) =>
{
// Returns the assembly of the type by enumerating loaded assemblies
// in the app domain
return AppDomain.CurrentDomain.GetAssemblies().Where(z => z.FullName == name.FullName).FirstOrDefault();
},
null,
true);
}
private static void Main(string[] args)
{
// Dynamically loads an assembly
var assembly = Assembly.LoadFrom(@"C:\...\ClassLibrary1.dll");
// Load the types using its assembly qualified name
var loadedType = LoadSomething("ClassLibrary1.Class1, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
Console.ReadKey();
}
答案 1 :(得分:0)
我遇到了同样的问题,我将程序集动态加载到当前应用程序域中,但 Type.GetType
不会从这些程序集中获取公共类型。不过,我不必提供程序集解析器。我的程序集位于一个子目录中,在我将该子目录添加到 app.config
文件中的应用程序探测路径后,它开始工作。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Modules;"/>
</assemblyBinding>
</runtime>
</configuration>
注意:探测路径仅适用于应用程序目录分支内的路径。
答案 2 :(得分:-1)
来自http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx
Type.AssemblyQualifiedName属性
类型:System.String Type的程序集限定名称,包括从中加载Type的程序集的名称,,如果当前实例表示泛型类型参数,则为null。
我认为这是因为方法签名有t作为类型。