リフレクションを使用して、.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 がこれらが同じアセンブリであると認識しない理由がわかりません。
よろしくお願いいたします。