Assembly.GetType()无法从ReSharper插件加载List`1 [[MyModel]]类型

时间:2013-12-09 16:17:21

标签: c# serialization reflection resharper json.net

我有一个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#插件时抛出)告诉我无法找到“Model”程序集。堆栈跟踪包含扫描的位置列表。所有这些位置都在VisualStudio安装目录下。

如上所述,上面两行实际上是Json.NET的一部分。因此,我无法改变它们。但是,我完全消除了Json.NET,同时缩小了这个问题。只需上面的两行,使用assemblyName和typeName各自的字符串值就可以重现问题。

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

提前致谢! 最好, 斯文

1 个答案:

答案 0 :(得分:1)

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

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