2012-12-03 76 views
2

我試圖用反射來完成(似乎是)一個極其簡單的.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沒有意識到這些是相同的程序集,即使我在不​​同的時間加載它們。

非常感謝您的幫助。

+2

作爲例外狀態,它也可能是* EntityFramework *所依賴的程序集之一,而不是* EntityFramework *程序集本身。您可能想要嘗試Fusion Logviewer:http://msdn.microsoft.com/en-us/library/e74a18c4.aspx – bitbonk

+0

是否有可能使用'Assembly.LoadFrom'或'Assembly動態加載EntityFramework程序集。 LoadFile'? –

+0

@mikez是的,那正是我所做的。這有什麼問題嗎? –

回答

1

我終於得到它的工作。基本上,我試圖通過加載每個程序集,檢查它的依賴關係並隨時發佈Assembly.Load和Assembly.LoadFile事件來手動處理AssemblyResolve事件。當我添加一個CurrentDomain_AssemblyResolve事件,當它被解僱時,運行我的自定義目錄搜索/程序集加載代碼,一切正常。

由於某些內部AppDomain/BundleContext問題,引發了異常。切換到AssemblyResolve解決了我的問題。不幸的是,這就是我所知道的事情。如果有人能解釋這裏的封面是什麼,我會接受一個答案。

+0

這正是我所建議的。該文檔描述了此行爲(http://msdn.microsoft.com/en-us/library/1009fa28(v=vs.110).aspx)和「如果程序集使用LoadFrom加載,並且稍後在加載程序中使用程序集上下文嘗試通過顯示名稱加載程序集,加載嘗試失敗。「但除非你已經意識到這個問題,它沒有什麼幫助。 –