我有一个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各自的字符串值,就足以重现问题。
有人能告诉我这种不同的行为是从哪里来的吗?或者更好:告诉我如何解决这个问题?
提前感谢!最好的Sven
当.net搜索Model程序集时,它只在应用程序设置的搜索路径中搜索,即VS安装目录等。它不在插件的位置中搜索。您可能需要向AppDomain.CurrentDomain.AssemblyResolve
添加一个事件处理程序。检查谁在调用,以及他们在寻找什么程序集,你可以加载程序集,也可以在内存中找到它并返回它。通常,返回内存中的程序集比再次尝试加载它要好(由于加载上下文的原因)。您可以使用AssemblyResolver
类来方便地安装和卸载处理程序,以便为您加载程序集。
此外,基于这被称为"模型"的事实,如果这是为了保存/加载设置,您最好使用ReSharper的设置基础设施,它提供了很大的灵活性,并消除了对AssemblyResolver
的需求。