16

假设我有一点代码:

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不是 null。我很困惑,因为如果我这样称呼它......

LoadSomething(typeof(SomeObject));

那么两者都不是空的,但我实际上正在做的更像是这样的(不是真的,这被大大简化了,但它说明了我的观点):

LoadSomething(Assembly.LoadFile(@"C:\....dll").GetTypes().First());

所以我的问题的第一部分(供我参考)是......

在第二种情况下,既然必须加载程序集并且我从中找到了类型,为什么Type.GetType返回 null?

其次(实际解决我的问题)......

当我只有程序集限定名称作为字符串时(我知道之前已使用 Assembly.Load 方法加载),是否有其他方法可以加载类型?

4

3 回答 3

25

当我只有程序集限定名称作为字符串时(我知道之前已使用 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();
}
于 2012-07-11T12:28:34.240 回答
0

我遇到了同样的问题,我将程序集动态加载到当前的 appdomain 中,但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>

注意:探测路径仅适用于应用程序目录分支内的路径。

于 2021-01-29T14:07:50.630 回答
-1

来自http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx

Type.AssemblyQualifiedName 属性

类型:System.String 类型的程序集限定名称,其中包括从中加载类型的程序集的名称,如果当前实例表示泛型类型参数,则为 null。

我认为这是因为方法签名将 t 作为类型。

于 2012-07-11T11:49:27.190 回答