2010-02-23 32 views
8

我有一個程序集Library1.dll它包含一些接口,它們被串行化爲一個字節數組到數據庫中。出於某些原因,我們必須更改接口屬性和定義。所以現在我正在編寫一個遷移實用程序。所以我有2個版本的Library1.dll,在我的實用工具中,我創建了一個文件夾,我在那裏存儲新版本的Library1.dll。此實用程序又參考Library1.dll,因此在bin文件夾中包含Library1.dll,但此dll是在舊版本上編譯的。我的新版本Library1.dll存儲在一個私人路徑,我正在傳遞給Assembly.ReflectionOnlyLoadFrom函數來實例化,因此GetTypes上的程序集加載,這進一步將使我能夠進行數據轉換。Assembly.ReflectionOnlyLoadFrom not working

但我總是得到ReflectionTypeLoadException當試圖從私人路徑加載Library1.dll

請幫幫夥計!!!任何幫助,將不勝感激。我很困難。

感謝, AG

+0

什麼是ReflectionOnlyLoadFromException的LoaderExceptions? http://blogs.msdn.com/suzcook/archive/2003/08/11/57236.aspx – 2010-02-23 20:07:12

+0

你試圖「遷移」的是什麼?數據?或者dll本身? – 2010-02-23 20:17:14

+0

試圖遷移數據 – netmatrix01 2010-02-23 20:25:39

回答

16

如果你的圖書館引用其他DLL,GetTypes會當它擊中使用外部類型的類型失敗。與正常的程序集加載不同,ReflectionOnly程序集加載不會解決依賴關係。您可以訂閱AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve並根據需要加載相關性,也可以預加載它們。

這是我使用這個代碼:

var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath); 
foreach (var assemblyName in assembly.GetReferencedAssemblies()) { 
    try { 
    Assembly.ReflectionOnlyLoad(assemblyName.FullName); 
    } catch { 
    Assembly.ReflectionOnlyLoadFrom(Path.Combine(Path.GetDirectoryName(assemblyPath), assemblyName.Name + ".dll")); 
    } 
} 

這將嘗試通過全稱第一加載反射僅加載組件的所有相關性,然後通過路徑(假定依賴性在同一目錄作爲加載的程序集)。

+0

Arne:你在這裏幫了我們很多。我們很難用頭撞牆。 – 2010-05-04 20:12:57

+0

有關使用ReflectionOnlyAssemblyResolve的示例代碼,請參閱http://blogs.msdn.com/b/junfeng/archive/2004/08/24/219691.aspx。 – 2011-03-01 12:45:32