2016-11-14 36 views
3

在我們的應用程序(包含65個項目的解決方案)中,在運行時分析所有引用的程序集以確定是否存在Ninject模塊(應用了一些過濾太)。這些模塊稍後會加載到Ninject內核中,並且每個模塊都會爲內核聲明綁定。在ReflectionOnly模式下將程序集加載到新AppDomain中時,方法沒有實現

我們已經採用了一個加載器,它將引用的程序集加載到僅反射模式下的單獨程序集中。與Ninject從目錄加載程序集的方式不同之處在於該目錄可以包含不應加載模塊的程序集。並且在最開始時,並未加載所有引用的程序集。

的問題是loader(信貸薩沙理髮)不能加載某些組件與

System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information 

LoaderExceptions一個條目:

Method 'BeforeLoad' in type 'Lekis.AppBase.Core.BLLBaseCore' from assembly 'AppBaseCore, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation. 

這裏有一些「有趣」的事實:

  • 方法BeforeLoad是虛擬的,一個實現接口方法
  • 上個星期,加載器異常說不同的方法沒有實現(該方法不是虛擬的),後來,當我明確地實現它時,消息說該方法沒有找到。上週
  • 組裝AppBaseCore目標框架是.NET 3.5和3個組件加載失敗
  • 現在組裝AppBaseCore目標框架是.NET 4和5個組件加載失敗
  • 一切都很好與應用否則

當我使用ILSpy和ILDAsm檢查它們時,組件沒有任何錯誤(顯然)。

在這一點上,我真的迷路了,不知道如何解決這個問題。

任何幫助表示讚賞。

感謝

+1

「方法'BeforeLoad'是虛擬的和接口方法的實現」。雖然它真的是真的嗎?檢查[所有的答案在這裏](http://stackoverflow.com/questions/948785/),以確保你沒有觸及某種版本/加載衝突。ILSpy/ILDAsm不會報告任何問題,因爲該程序集在結構上是有效的。 –

+0

謝謝,@JeroenMostert。我會看看它。 –

回答

3

回答我的問題:

當異常被拋出,我去了堆棧跟蹤和上市中創建的孩子的AppDomain中加載的組件:

AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies() 
{System.Reflection.RuntimeAssembly[15]} 
... 
[13]: {System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 
[14]: {System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089} 

,發現裝配的兩個版本System.Data。有問題的方法有一個System.Data.IDbTransaction類型的參數。

第一個被引用的項目針對.NET框架3.5。將其更改爲4.0後,一切正常。

什麼是一個愚蠢的問題...

相關問題