[英]How would I load an assembly from the GAC?
我正在嘗試使用Assembly.Load()來加載GAC中的程序集。 例如,假設我要列出PresentationCore.dll中存在的所有類型,我將如何加載PresentationCore.dll ?
當我嘗試這個:
Assembly a = Assembly.Load("PresentationCore.dll");
我得到一個FileNotFoundException 。 關於SO的另一個答案建議我使用Assembly.LoadFrom()來完成這個 - 我很猶豫,因為根據Visual Studio 2008,不推薦使用Assembly.LoadFrom() - 而且它似乎並沒有真正起作用。
有任何想法嗎?
如果程序集在GAC中,則必須通過其完全限定名稱加載它。
例如,如果我想加載mscorlib.dll
我會這樣做:
Assembly a = Assembly.Load
("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
確定程序集的完全限定名稱的最簡單方法是在Reflector中加載程序集,並使用下部顯示窗格中的Name字段,如下所示:
您需要將程序集的名稱傳遞給Assembly.Load()
,而不是DLL的名稱。 如果在Reflector中打開DLL,則名稱應位於窗口的底部。 在PresentationCore.dll的情況下,名稱應該類似於PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
。
我建議您查看運行時如何在MSDN庫中查找程序集 ,以了解CLR嘗試加載程序集時會發生什么。
對於診斷特定問題, Fusion Log Viewer工具非常棒。 Fusion開發人員之一Suzanne Cook在她的博客上有一個指南 ,過去曾幫助過我。
獲取字符串的最簡單方法是首先添加對項目的引用,然后執行以下操作:
string regStringMath = typeof(System.Math).Assembly;
Assembly assMath = Assembly.Load("System.Math", regStringMath);
string regStringPres = typeof(PresentationCore).Assembly;
Assembly assPres = Assembly.Load("PresentationCore", regStringPres);
這將確保您獲得作為項目參考添加的正確版本。
使用GetAssemblyName( http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.getassemblyname.aspx )獲取dll的完全限定程序集名稱,並將其傳遞給Assembly.Load()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.