2013-12-09 18 views
0

我有一個R#插件和一個測試項目(不是R#測試項目,而是一個簡單的普通單元測試項目)。在插件的代碼中,我從序列化類型信息中做了一些類型的分辨率。在這種類型上是我的一個模型類的對象列表。該類型的序列化看起來是這樣的:Assembly.GetType()無法從ReSharper插件僅加載List`1 [[MyModel]]類型

"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的字符串值就足以重現問題。

有人可以告訴我這種不同的行爲起源於哪裏嗎?或者更好:告訴我如何解決這個問題?

在此先感謝! Best, Sven

回答

1

當.net搜索您的模型組件時,它只會查找應用程序設置的搜索路徑,即VS安裝目錄等等。它不會搜索插件的位置。您可能需要添加一個事件處理程序到AppDomain.CurrentDomain.AssemblyResolve。檢查誰在呼叫,以及他們在做什麼樣的組裝,然後您可以加載程序集,也可以在內存中找到它並將其返回。返回內存中的程序集通常會比嘗試重新加載(由於加載上下文)更好。您可以使用AssemblyResolver類來簡化安裝和卸載處理程序以便爲您加載程序集。

此外,基於這個被稱爲「Model」的事實,如果這是用於保存/加載設置,那麼最好使用ReSharper的設置基礎結構,這提供了很大的靈活性,並且不需要AssemblyResolver

+0

與此同時,我發現使用Type.GetType(「typename,assemblyName」)而不是上述方法爲我解決了這個問題。因此,無論我的程序集實際上是AppDomain.CurrentDomain的一部分(問題出在其他地方)或Type.GetType()在其他地方搜索程序集。無論哪種方式,它還不適合我的心理模型... –

+0

我發現[這個問題](http://stackoverflow.com/questions/4009382/type-gettype-fails-to-create-type -from-already-loaded-assembly),它使我更清楚實際發生了什麼。我仍然不完全確定我知道發生了什麼,但我想我已經足夠了解爲我的案例編寫解決方法......謝謝! –

相關問題