2009-06-15 122 views
3

我正在尝试使用Assembly.Load()来加载GAC中的程序集。例如,假设我想列出PresentationCore.dll中存在的所有类型,我将如何去加载PresentationCore.dll我如何从GAC加载程序集?

当我试试这个:

Assembly a = Assembly.Load("PresentationCore.dll"); 

我得到FileNotFoundException异常Another answer on SO建议我使用Assembly.LoadFrom()完成此操作 - 根据Visual Studio 2008,我不愿意这样做,因为Assembly.LoadFrom()已被弃用 - 此外,它似乎并不实际工作。

任何想法?

回答

11

如果程序集位于GAC中,则必须通过其完全限定名称加载该程序集。

例如,如果想装入mscorlib.dll我会做这样的事情:

Assembly a = Assembly.Load 
    ("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 

最简单的方法来确定程序集的全名是加载组件Reflector和使用名称

http://i42.tinypic.com/2m30ocn.png

+0

完美,谢谢! – 2009-06-15 19:42:53

5

您需要将组件的名称:这样从下显示面板领域,而不是DLL的名称。如果您在Reflector中打开DLL,则该名称应该位于窗口的底部。在PresentationCore.dll的情况下,名称应该类似于PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

+2

+1好点 - 它是程序集的逻辑名称 - 不是物理文件名 - 需要 – 2009-06-15 19:42:57

3

我建议你看看MSDN库中的How the Runtime Locates Assemblies,以了解CLR尝试加载程序集时会发生什么。

对于诊断特定问题,Fusion Log Viewer工具太棒了。其中一位Fusion开发人员Suzanne Cook在她的博客上有一个guide,这在过去帮助过我。

1

得到字符串的最简单的方法是先引用添加到您的项目,然后做到这一点:

string regStringMath = typeof(System.Math).Assembly; 
Assembly assMath = Assembly.Load("System.Math", regStringMath); 

string regStringPres = typeof(PresentationCore).Assembly; 
Assembly assPres = Assembly.Load("PresentationCore", regStringPres); 

这将确保你得到你添加到您的项目引用正确的版本。

+0

haha​​,`assMath` – Jonesopolis 2016-05-24 20:02:14

相关问题