2011-11-22 30 views
1

在該主題Difference between LoadFile and LoadFrom with .NET Assemblies?我發現下面的代碼:對於同一個裝配體的兩個副本,裝配體標識是否可以不同?

Assembly assembly1 = Assembly.LoadFrom(path1); 
Assembly assembly2 = Assembly.LoadFrom(path2); 

// These both point to the assembly from path1, so this is true 
Console.WriteLine(string.Compare(assembly1.CodeBase, assembly2.CodeBase) == 0); 

我做了這麼:

Assembly ass1 = Assembly.LoadFrom(Path.GetFullPath ("DataTypes.dll")); 
    Assembly ass2 = Assembly.LoadFrom(Path.GetFullPath("test\\DataTypes.dll")); 

    Console.WriteLine(ass1.CodeBase == ass2.CodeBase); 

DataTypes.dll從文件夾中的測試是DataTypes.dll從程序文件夾拷貝。預計結果是真實的,但我的程序顯示爲FALSE。如果需要,我可以提供任何信息來解釋。

+0

是DataTypes.dll強命名的程序集? – mgronber

+0

不,這不是.. – Vasya

+1

這是你的問題。您將需要強名稱的程序集,以便可以比較其身份。 – mgronber

回答

2

它來自不同的副本,因此它是不同的代碼庫。如果他們具有相同的強名,那麼就召集大會而言,他們是相同的。除了文件的二進制比較之外,我看不出如何保證你正在尋找的等值。

2

我對你的問題的解決方案

你把你的組件中的兩個文件夾,但相同的組件,

 var asmPath = AppDomain.CurrentDomain.BaseDirectory; // Your assemblies's root folder 
     var asmFullPath1 = System.IO.Path.Combine(asmPath, @"test\ClassLibrary1.dll"); 
     var asmFullPath2 = System.IO.Path.Combine(asmPath, @"test2\ClassLibrary1.dll"); 
     Assembly asm1 = System.Reflection.Assembly.LoadFrom(asmFullPath1); 
     Assembly asm2 = System.Reflection.Assembly.LoadFrom(asmFullPath2); 
     Console.WriteLine(asm1.CodeBase == asm2.CodeBase); 

你會得到相同的代碼

要查找有關的更多信息CodeBase

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.codebase.aspx

+0

位置比較也顯示fals。 – Vasya

+0

我已經更新了我的回覆。讓我們來看看 –

+0

即使你到了codebase1 = codebase2,那實際上意味着什麼?這些dll完全一樣嗎?不。這一切都取決於@Praetor12試圖通過codebase1 = - codebase2實現的目標。 –

1

代碼庫的MSDN定義:

按規定本來

你可能想比較assembly.Location而不是組裝的位置。

1

正如Tony所說 - 這兩個程序集已經從不同的代碼庫加載(即在磁盤上或者實際上在局域網或廣域網上的位置),因此不僅.net加載(愚蠢 - 但本身並不笨),但它也會看到每個程序集都不同 - 每個程序集中的每個重複類型都被認爲是不同的。

因爲這個原因,我非常謹慎地使用LoadFrom,因爲它會很高興地從不同位置加載相同的組件。

這是一種現象,也可能發生 - 相當激烈的結果 - 在網站,其中,如果預加載程序集,試圖從文件夾使用LoadFrom預加載,而實際上aqssemblies通常會通常從Temporary Asp.Net Folder(TempASP)加載。

在此場景中,可以從bin\AssemblyA.dll預加載AssemblyA,然後運行時從TempASP\AssemblyA.dll再次加載它,因爲該文件夾首先位於Load所使用的搜索路徑中。這可能會導致真正令人討厭的副作用,如InvalidCastException被引發到代碼的編譯部分,您認爲這些代碼可能無法正常引發錯誤。

如果比較平等,那麼二進制比較,正如託尼所建議的那樣,是您最好的選擇。但是,如果您實際上只是想加載這些程序集的其中一個副本,那麼您應該考慮首先從DLL中獲取AssemblyName(其中有一個構造函數不會加載程序集),然後傳遞該名稱到Assembly.Load - 然後它會從正確的位置加載它。

相關問題