【问题标题】:Why would Type.GetType() work and Assembly.GetType() not work?为什么 Type.GetType() 有效而 Assembly.GetType() 无效?
【发布时间】:2011-09-11 23:45:15
【问题描述】:

我试图在运行时从程序集列表中找到一个类型;我的代码是这样的:

foreach (Assembly assembly in assembliesToSearch)
{
    Type t = assembly.GetType(assemblyName);
    if (t != null)
    {
        return t;
    }
}

,我遇到的问题是 t 总是出现为空。在 VS2010 中使用调试器和中间窗口,当我在循环中放置断点时,我注意到以下内容:

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

工作正常,但是

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName)

没有(当程序集是我知道的包含我正在寻找的类的程序集时 - 在调试器中,我可以监视 assembly.GetTypes(),浏览到我要实例化的类,并调用 assembly.GetType("MyNamespace.MyClass, MyNamespace"))。

有谁知道为什么使用 Type.GetType() 搜索所有程序集有效,但使用 assembly.GetType() 搜索我知道包含该类型的程序集却没有?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

    从这两种方法的 MSDN 文档中,Type.GetType() 需要 类型的程序集限定名称,而 Assembly.GetType() 需要 类型的全名。这些不是一回事。

    typeof(MyNamespace.MyClass).AssemblyQualifiedName 计算为一种类型的程序集限定名称(类似于MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral),因此它不适用于Assembly.GetType() 调用,该调用需要格式为MyNamespace.MyClass 的字符串。

    这可能是因为当您将程序集限定名称传递给Assembly.GetType() 调用时,它会在程序集中寻找一个全名与您提供的名称匹配的类型。它找不到一个,所以你得到一个 null 返回。 Type.GetType() 调用并非如此,因为它希望获得一个类型的程序集限定名称,并且可以定位程序集和类型。


    注意事项:

    如果您如您所说“尝试在运行时从程序集列表中定位类型”,则最好对列表中的每个程序集使用 Assembly.GetType() 调用并传入类型的全名。 Type.GetType() 很可能会使用当前程序集的引用来解析类型,因此如果该类型存在于不是引用的程序集中,则不会找到它。

    【讨论】:

    • 感谢您的回复;我的初始代码示例没有清楚地显示它,但是在我调用 Type t = assembly.GetType(assemblyName) 的循环中,assemblyName 是“MyNamespace.MyClass,MyAssembly”,所以据我估计,它应该返回期望类型。
    • @David: MyNamespace.MyClass, MyAssembly 仍然是程序集限定的类型名称。您需要从该字符串中删除程序集名称才能使用Assembly.GetType()
    • @adrianbanks - 你从哪里了解到“Type.GetType() 很可能会使用当前程序集的引用来解析类型” - 它似乎不在 MSDN here .另外,什么是“当前程序集”?在我现在正在查看的情况下,具有类型的程序集 - 已找到! - 不是具有当前执行方法的程序集,也不是它的引用……但它调用堆栈上的一个程序集。 (我的问题的原因:我的程序集名称中的版本错误但类型找到了。)
    • 我通过思考它的工作原理来推测它。不太可能搜索每个可能的程序集(例如 GAC 中的每个 dll 加上当前应用程序路径中的每个 dll),因此可以在搜索路径中使用程序集的引用。我认为“当前程序集”是指包含使用 Type.GetType() 的类型的程序集。 “但它是调用堆栈上的一个程序集” - 所以你的意思是引用的引用?如果是这样,那么我希望能够找到它,因为类型解析器将执行递归引用遍历。
    • @adrianbanks - 好吧,我的意思是引用出错了......调用堆栈上更高的程序集有一个对包含包含调用Type.GetType()的方法的类型的程序集的引用- 但不是相反。我想知道答案是否在 Essential .NET Volume 1 中? (那本书从来没有第二版或第二卷,这不是很遗憾吗?)
    猜你喜欢
    • 2020-03-09
    • 2011-07-05
    • 2012-01-15
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多