2

リフレクションを使用して、.NET の非常に単純な依存性注入メカニズム (と思われるもの) を達成しようとしています。目標は、ServiceFactory クラスへのインターフェイスを提供し、リフレクションを使用してそのインターフェイスの使用可能な実装者をスコープアウトし、App.config セクションに基づいて実装を選択することです。シンプルに聞こえます。

私が選択したルートは、各サービス実装プロジェクトのビルド後イベントを使用して、実装 .dll を "ServiceImplementations" フォルダーにコピーすることです。次に、ServiceFactory クラスはこのフォルダーを調べて、使用可能な有効なインターフェイスの実装者を見つけます。リフレクションを使用すると、この任意の DLL とそのすべての依存関係を、実行時に純粋にリフレクションでロードできるはずです。これが私が達成したい目標です。

プロセスのどこかで、これらの依存関係を問題なくロードしています。現在ロードされているアセンブリを var asmDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies() で確認できます

そのため、Reflection クロールを続行し、依存アセンブリ (この場合は、NuGet によって読み込まれた EntityFramework、およびシステム ファイルである System.Web.ApplicationServices) を読み込みます。すべてが順調です。このコード行に到達するまで:

        var serviceImplementationAssembly = CheckLoadedAssemblies(assemblyName);  // This function loads the service implementation assembly and its dependencies
        var appDomainAsm = AppDomain.CurrentDomain.GetAssemblies();
        var implementationTypes = serviceImplementationNamespace.GetTypes();      // Exception here

コードの最後の行で、ReflectionTypeLoadException がスローされます。この例外には、次のメッセージを含む 2 つの LoaderException (それぞれが FileNotFoundException) が含まれています。

         Could not load file or assembly 'EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.":"EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

これは非常に奇妙です。上記の asmDomainAsm 変数を確認すると、正確なアセンブリ シグネチャ現在の AppDomain に読み込まれていることがわかります。異なる時間にロードしたにもかかわらず、Reflection がこれらが同じアセンブリであると認識しない理由がわかりません。

よろしくお願いいたします。

4

1 に答える 1

1

私はついにそれを働かせました。基本的に、私は AssemblyResolve イベントを手動で処理しようとしていました。各アセンブリをロードし、その依存関係をチェックし、必要に応じて Assembly.Load および Assembly.LoadFile イベントを発生させました。CurrentDomain_AssemblyResolve イベントを追加すると、起動時にカスタム ディレクトリ検索/アセンブリ ロード コードが実行され、すべてが機能しました。

内部の AppDomain / BundleContext の問題により、例外がスローされていました。AssemblyResolve に切り替えると、問題が解決しました。残念ながら、何が起こったのかについて私が知っているのはそれだけです。ここで何が起こっているのかを誰かが説明できるなら、私は答えを受け入れます。

于 2012-12-03T16:14:48.330 に答える