簡體   English   中英

我如何從GAC加載程序集?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM