2010-05-27 53 views
3

鎖定DLL在一個AppDomain是否有可能從大會沒有實際上在當前的應用程序域加載它讀取GUID。閱讀組裝GUID沒有中等信任ASP.Net

通常Assembly.Load加載DLL到應用程序域。我只想讀取價值。

GUID的描述是

'The following GUID is for the ID of the typelib 
' if this project is exposed to COM 
<Assembly: Guid("DEDDE61CD-928E-4ACD-8C25-3B8577284819")> 

主要的事情是我不想要鎖定的文件,以便有沒有錯誤「另一個進程正在訪問該文件」的錯誤。

+0

加載程序集時完全沒有問題嗎?如果沒有,如何將它加載到不同的應用程序域中? – 2010-05-27 16:40:33

+0

我想避免鎖定正在讀取的文件。 – ggonsalv 2010-05-27 17:43:54

+0

我會審查推送的項目,並選擇一個答案.... – ggonsalv 2010-06-02 14:22:42

回答

6

如果您加載使用Assembly.ReflectionOnlyLoad(byte[])組件將其加載的陰影,也不會鎖定該文件。

var bytes = File.ReadAllBytes(path); 
var assembly = Assembly.ReflectionOnlyLoad(bytes); 

這通常是像Reflector這樣的工具訪問程序集而不鎖定它們的工具。

+0

如果使用字節數組(如上例所示),則ReflectionOnlyLoad()調用不是必需的。使用標準Assembly.Load()加載程序集的字節也不會鎖定文件。從字節數組加載會斷開文件中的程序集內容,因此不會發生鎖定。 – shahzbot 2015-08-13 00:37:29

+0

這是準確的,如果唯一的目標是避免鎖定程序集,則不需要ReflectionOnlyLoad。但是,OP的問題表明他不想將程序集加載到應用程序域中。 ReflectionOnlyLoad是實現這一目標的最簡單方法。使用byte []重載,雖然沒有鎖定程序集。 – hemp 2016-08-23 19:18:30

0

每個.NET程序集都是一個PE(Program Executable)文件。其內部格式被記錄。如果有IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR目錄中,其指向IMAGE_COR20_HEADER結構,其具有參考MetaData節,其具有StreamsStreamHeaders字段。您應該在StreamHeaders中找到流名稱爲#GUID的流的位置,並從Streams中讀取相應的數據塊。如果您打開IL Disassembler ildasm.exe(Windows SDK工具)的.NET DLL及其頭文件(請參閱菜單View和Headers),您將看到steams的結構。

你可以閱讀更多信息http://msdn.microsoft.com/en-us/magazine/cc301808.aspxhttp://www.ntcore.com/files/dotnetformat.htm#MetaSection和​​(從中可以從http://ntcore.com/exsuite.php下載「資源管理套件」的作者)。

您也可以考慮使用IID_IMetaDataDispenser讀取從組件matadata信息的方式。見http://www.remotesoft.com/salamander/obfuscator/MyApp/MyPrivateLib.cpp.txthttp://www.wheaty.net/downloads.htm

1

「元」的例子,因爲鎖是你的問題,你可以得到你想要的東西通過使用不同的AppDomain與Shadow Copy enabled(這是ASP.NET使用文件保存非常相同的功能解鎖)時加載文件。這不會鎖定原始文件。

除此之外,存在Assembly.Load() which takes a byte[]過載,這樣就可以在第一數據加載到存儲器中,然後從存儲器加載組件。雖然沒有嘗試過,所以我不知道這種替代方法實際上起作用。

0

我建議你創建一個單獨的AppDomainAppDomain.CreateDomain()),然後再加載Assembly文件轉換成字節數組,調用AppDomain.Load()它接受一個字節數組,檢索Guid最後使用AppDomain.Unload()卸載創建AppDomain

這將保持您的內存清潔,彙編代碼與主應用程序代碼分開,當然Assembly文件不會被鎖定。當然,您應該使用某種緩存來避免多次加載相同的文件。文件操作和反射調用相當昂貴(就執行時間而言)。