【问题标题】:Assembly.GetType() fails to load List`1[[MyModel]] type from ReSharper Plugin onlyAssembly.GetType() 无法仅从 ReSharper 插件加载 List`1[[MyModel]] 类型
【发布时间】:2013-12-09 16:17:20
【问题描述】:

我有一个 R# 插件和一个测试项目(不是 R# 测试项目,而是一个简单、普通的单元测试项目)。在插件的代码中,我从序列化的类型信息中进行了一些类型解析。在这种类型上是来自我的一个模型类的对象列表。类型的序列化如下所示:

"System.Collections.Generic.List`1[[Model.Foo, Model]], mscorlib"

我通过以下调用加载此类型(或者实际上是 Json.NET):

Assembly assembly = Assembly.LoadWithPartialName(assemblyName);
Type type = assembly.GetType(typeName);

在我的测试项目中,当我运行这段代码时,一切正常。 assemblyName 是“mscorlib”,第一行解析 mscorlib 程序集(作为 RuntimeAssembly 的一个实例)。 typeName 是“System.Collections.Generic.List`1[[Model.Foo, Model]]”,调用 GetType() 可以解析我的类型。

但是,当我运行 R# 插件时,GetType() 调用返回 null。直到我从测试项目执行时,一切看起来都像那条线。这两个项目都引用了“模型”程序集。当我尝试使用完全相同的机制仅解析“Model.Foo,Model”类型时,它在 R# 插件和测试项目中都有效。

当我允许 GetType() 调用抛出异常时,FileNotFound 异常(当然只在运行 R# 插件时抛出)告诉我找不到“模型”程序集。堆栈跟踪包含已扫描位置的列表。所有这些位置都在 VisualStudio 安装目录下。

如前所述,上面两行实际上是 Json.NET 的一部分。因此,我无法更改它们。但是,我在缩小此问题范围的同时完全消除了 Json.NET。仅上面两行,以及 assemblyName 和 typeName 的相应字符串值就足以重现问题。

谁能告诉我这种不同的行为来自哪里?或者更好:告诉我如何解决这个问题?

提前致谢! 最好的, 斯文

【问题讨论】:

    标签: c# serialization reflection resharper json.net


    【解决方案1】:

    .net 搜索您的模型程序集时,它只查找应用程序设置的搜索路径,即 VS 安装目录等。它不会在您的插件的位置进行搜索。您可能需要向AppDomain.CurrentDomain.AssemblyResolve 添加一个事件处理程序。检查谁在调用,以及他们在寻找什么程序集,您可以加载程序集,或者在内存中找到它并返回它。通常最好返回内存中的程序集,而不是尝试再次加载它(由于加载上下文)。您可以使用AssemblyResolver 类来轻松安装和卸载处理程序来为您加载程序集。

    此外,基于这被称为“模型”的事实,如果这是用于保存/加载设置,您最好使用 ReSharper 的设置基础结构,它提供了很大的灵活性,并且不需要 @ 987654324@.

    【讨论】:

    • 同时,我发现使用 Type.GetType("typename, assemblyName") 代替上述方法可以解决我的问题。因此,要么我的程序集实际上是 AppDomain.CurrentDomain 的一部分(问题出在其他地方),要么 Type.GetType() 在其他地方搜索程序集。无论哪种方式,它都不适合我对正在发生的事情的心理模型......
    • 我发现 this question 让我更清楚实际发生了什么。我仍然不完全确定我知道发生了什么,但我想我理解的足够多,可以为我的案例编写一个解决方法......谢谢!
    猜你喜欢
    • 2019-10-18
    • 2015-06-24
    • 1970-01-01
    • 2022-11-11
    • 2019-07-24
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多