我試圖用反射來完成(似乎是)一個極其簡單的.NET依賴注入機制。目標是爲ServiceFactory類提供一個接口,並使用反射來限定該接口的可用實現者,並根據App.config部分選擇一個實現。聽起來很簡單。C#反射 - 加載外部DLL和所有依賴關係
我選擇的路線是使用每個服務實施項目的生成後事件將實施.dll複製到「ServiceImplementations」文件夾中。然後,ServiceFactory類在該文件夾中查找以查找可用的,有效的接口實現者。這個想法是,使用反射,我應該能夠在運行時純粹在反射中加載這個任意的DLL及其所有依賴。這是我希望達到的目標。
在這個過程中的某個地方,我正在加載這些依賴關係。我可以檢查我的 VAR asmDomainAssemblies = AppDomain.CurrentDomain.GetAssemblies)當前加載的程序集(
所以我通過反射爬行前進,我結束了加載依賴程序集(在這種情況下是的EntityFramework,通過加載的NuGet和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。這個異常包含兩個LoaderExceptions(每個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沒有意識到這些是相同的程序集,即使我在不同的時間加載它們。
非常感謝您的幫助。
作爲例外狀態,它也可能是* EntityFramework *所依賴的程序集之一,而不是* EntityFramework *程序集本身。您可能想要嘗試Fusion Logviewer:http://msdn.microsoft.com/en-us/library/e74a18c4.aspx – bitbonk
是否有可能使用'Assembly.LoadFrom'或'Assembly動態加載EntityFramework程序集。 LoadFile'? –
@mikez是的,那正是我所做的。這有什麼問題嗎? –