2011-04-15 87 views
5

因此,這裏的情況:大會文件重命名和Assembly.LoadFile

我有一個名爲Lib1.dll組件。出於某種原因(與問題無關),我必須將程序集文件名重命名爲Lib1New.dll,現在嘗試使用Assembly.LoadFile加載重命名的程序集時,我注意到CLR也嘗試加載Lib1.dll。

如果在搜索路徑中找到Lib1.dll,它會將其加載到地址空間中。無論是否找到Lib1.dll,該應用程序都可以正常工作。 (問題是如果發現Lib1.dll文件被鎖定,不能被其他進程刪除)。

enter image description here

我不明白爲什麼的LoadFile搜索和負載Lib1.dll。 LoadFile應該在指定位置加載程序集文件的內容,爲什麼它搜索文件。

MSDN文檔的LoadFile:

使用的LoadFile方法來加載並檢查具有相同身份組件,但位於不同的路徑。與LoadFrom方法一樣,LoadFile不會將文件加載到LoadFrom上下文中,也不會使用加載路徑解析依賴項。 LoadFile在這個有限的場景中很有用,因爲LoadFrom不能用於加載具有相同身份但路徑不同的程序集;它只會加載第一個這樣的程序集。

回答

2

我建議你嘗試簡化你的問題,因爲我只是試圖重現你的情況,並沒有遇到任何問題。我創建了一個Lib.dll程序集,編譯它,創建了一個使用LoadFile加載它的控制檯應用程序,然後將Lib.dll和控制檯對其的引用重命名爲「LibNew.dll」。然後我重新編譯lib.dll並運行控制檯應用程序。此時我無法刪除LibNew.dll,但我能夠刪除Lib.dll。

我懷疑你的Lib.dll可能被加載從自己組裝一些信息,因爲它啓動,並在內部使用另一裝載功能的話,這最終發現原來Lib.dll。但是,如果你有一個非常簡單的DLL,它不會做額外的負載。我的DLL有一個函數,我可以調用,但我仍然看到我上面報告的結果。這裏是我的代碼:

控制檯應用程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Reflection.Assembly assy = System.Reflection.Assembly.LoadFile(args[0]); 
     Type class1 = assy.GetType("Lib.Class1"); 

     System.Reflection.MethodInfo myMethod = class1.GetMethod("MyMethod"); 
     Console.WriteLine(myMethod.Invoke(null, new object[] {"This is a string"}).ToString()); 

     Console.ReadLine(); 
    } 
} 

庫:

namespace Lib 
{ 
public class Class1 
{ 
    public static string MyMethod(string param) 
    { 
     return "Fixed: [" + param.Replace(" ", "-") + "]"; 
    } 
} 
} 

監測只是調用的LoadImage,我看到它並沒有試圖加載Lib.dll: Process Monitor Trace of LoadImage calls

但是,監視所有事件,我看到它做了 probe.dll的應用程序direc中的direc保守黨。 Process Monitor Trace of all references to Debug\Lib

也許如果你把DLL放在另一個目錄中,你可以強制你想要的行爲?不過,考慮到文檔,這是奇怪的行爲。

+0

感謝BlueMonkMN,這是有道理的。如果庫正在動態加載,那麼它可能會加載原始庫,但是我附帶的過程監視器日誌是使用以下Lib1 使用System生成的; namespace Lib1 { public class Class1 {public void SayHello(){ Console.WriteLine(「Class1 :: SayHello」); } } } 您可以運行進程監視器並檢查控制檯應用程序是否嘗試加載這兩個DLL。 – 2011-04-15 19:06:56

1

LoadFile使用Windows文件搜索,而不是.NET的程序集解析。但它仍然搜索該文件。

它類似於調用new FileStream()在那裏你可以通過一個文件名,它會尋找它在PATH等,如果它是一個相對路徑。

+0

LoadFile不適用於相對路徑,它需要程序集的絕對路徑,所以我不認爲上面的答案與這個問題有關。謝謝無論如何 – 2011-04-15 21:47:21