2013-05-07 41 views
0

我的應用程序根據.NET應用程序的代碼結構生成圖表。 Assembly.LoadFile的作品,但只有當我的應用程序已被放入與我正在加載的程序集相同的文件夾(似乎是由於引用的程序集);如果它不在同一個文件夾中,則如果加載的程序集的依賴項不在GAC中,則會得到ReflectionTypeLoadException異常。無法加載引用程序集以進行反射

我試過用Assembly.ReflectionOnlyLoadFrom代替。

AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += ResolveAssembly; 
Assembly loadedAssembly = Assembly.ReflectionOnlyLoadFrom(FileName); 

有以下事件:

Assembly ResolveAssembly(object sender, ResolveEventArgs args){ 
    return Assembly.ReflectionOnlyLoad(args.Name); 
} 

但是ResolveAssembly只拿到呼籲SystemSystem.Windows.FormsSystem.Drawing。它沒有被請求OpenTK.dllOpenTK.GLControl.dll和其他引用的程序集。當我撥打loadedAssembly.GetTypes()時,它也拋出了ReflectionTypeLoadException

我怎樣才能讓它加載引用的程序集,以便我不必強制將我的應用程序放入與其檢查的程序集相同的文件夾中?

更新:

當我打電話Assembly.ReflectionOnlyLoadFrom,我可以用GetReferencedAssemblies()觀察從裝配的引用。當我檢查AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()時,我注意到只裝載了一個組件(最初指定的一個)。換句話說,引用的程序集並不會被加載(儘管掛接了ReflectionOnlyAssemblyResolve)。

+0

也許它們被加載到一個單獨的應用程序域? – animaonline 2013-05-07 08:54:49

回答

0

您可以嘗試的第一件事就是處理AppDomain.CurrentDomain.AssemblyResolve事件並自行解決它。

我可能會考慮的第二件事情是產生第二個AppDomain,將bin/probe-path設置爲目標目錄,並且基本上將AppDomain中的工作重新定位。

但是,我也會認真考慮使用一個獨立的加載程序,也就是說,它並不與.NET運行庫的所有綁定在一起。在一些類似的工作中(檢查與應用程序本身無關的程序集 - 僅用於信息等),我大量使用了IKVM.Reflection.dll,它允許您創建一個單獨的Universe - 它具有相同的基本API作爲常規反射,但坦率地說它不會讓人感到困惑(再加上它允許您爲其他目標平臺加載程序集,這很方便)。

+0

試過(#1和#2),仍然沒有運氣。總是得到'BadImageFormatException','ReflectionTypeLoadException'或'FileNotFoundException'。然而,當我的應用程序在同一個文件夾中時,它可以工作。這麼奇怪。 – 2013-05-07 09:10:45

+0

@史密斯先生,因爲我列出了3個選項,這兩個選項你試過了嗎? – 2013-05-07 09:11:16

+0

當您嘗試加載未針對當前框架編譯的程序集時,還會引發Mr.Smith'BadImageFormatException'。你檢查過了嗎? – Fabske 2013-05-07 09:15:21