Assembly.GetType()未能从ReSharper的插件只加载List`1 [[为MyMo

2019-10-30 01:31发布

我有一个R·插件和一个测试项目(未A 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,型号]]” 和调用的GetType()解析我的类型。

当我运行将R#插件,但是,对GetType()调用返回null。 直到该行一切看起来当我从测试项目执行等。 这两个项目都引用了“模式”集会。 当我试图解决只使用完全相同的机制的类型“Model.Foo,型号”,它工作在R#插件和测试项目都。

当我允许的GetType()调用抛出异常,FileNotFound异常(当然只运行将R#插件时抛出)告诉我,“模型”组件无法找到。 堆栈跟踪包含被scannened该位置的列表。 所有这些位置是VisualStudio的安装目录下。

如所提到的,上面的两行是实际Json.NET的一部分。 因此,我不能改变它们。 不过,我完全消除Json.NET而缩小这个问题。 只是两行以上,具有的AssemblyName和的typeName的相应字符串值足以重现该问题。

谁能告诉我在哪里,这个不同的行为从起源? 或者更好:告诉我怎么解决这个问题?

提前致谢! 最好的,斯文

Answer 1:

当.NET是搜索您的模型装配,它只是看起来在应用程序设置搜索路径,即在VS安装目录等。 它不会在你的插件的位置进行搜索。 你可能会需要一个事件处理程序添加到AppDomain.CurrentDomain.AssemblyResolve 。 检查谁打电话,什么组装他们之后,你可以加载该程序集,或者发现它在内存中,并返回。 它通常是更好地回报你的内存有一个组件,而不是试图再重新装(由于负载环境)。 您可以使用AssemblyResolver类可以很容易地安装和卸载处理程序加载组件为您服务。

此外,基于这样的事实,这就是所谓的“模型”,如果这是保存/载入设置,你会更好使用ReSharper的设置的基础设施,它提供了很大的灵活性,并消除了对需要AssemblyResolver



文章来源: Assembly.GetType() fails to load List`1[[MyModel]] type from ReSharper Plugin only