5

私たちのアプリケーション (65 プロジェクトのソリューション) では、参照されているすべてのアセンブリが実行時に分析され、Ninject モジュールの存在が確認されます (フィルタリングも適用されます)。モジュールは後で Ninject カーネルにロードされ、各モジュールはカーネルのバインディングを宣言します。

参照されたアセンブリをリフレクションのみのモードで別のアセンブリにロードするローダーを採用しました。Ninject がディレクトリからアセンブリをロードする方法との違いは、ディレクトリには、ロードしてはならないモジュールを含むアセンブリを含めることができるということです。また、最初は、参照されているすべてのアセンブリが読み込まれるわけではありません。

問題は、ローダー(Sacha Barber の功績) が一部のアセンブリをロードできないことです。

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

LoaderExceptions1 つのエントリで:

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 でアセンブリをチェックしたところ、(明らかに) アセンブリに問題はありません。

この時点で、私は本当に迷っており、この問題に取り組む方法がわかりません。

どんな助けでも大歓迎です。

ありがとう

4

3 に答える 3

6

私自身の質問に答える:

例外がスローされたとき、スタック トレースを調べて、作成された子 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そして、アセンブリの 2 つのバージョンに気付きました。問題のメソッドには type のパラメーターがありますSystem.Data.IDbTransaction

最初のものは、.NET Framework 3.5 を対象とするプロジェクトで参照されました。4.0に変更すると、すべて正常に動作します。

なんて愚かな問題...

于 2016-11-16T10:25:21.750 に答える