我如何从GAC加载程序集?

时间:2009-06-15 19:28:46

标签: c# .net-3.5

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

当我尝试这个时:

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

我收到 FileNotFoundException Another answer on SO建议我使用Assembly.LoadFrom()来实现这一点 - 我对此犹豫不决,因为根据Visual Studio 2008,不推荐使用Assembly.LoadFrom() - 此外,它似乎并没有真正起作用。

有什么想法吗?

5 个答案:

答案 0 :(得分:11)

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

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

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

确定程序集的完全限定名称的最简单方法是在Reflector中加载程序集并使用下方显示窗格中的名称字段,如下所示:

答案 1 :(得分:5)

您需要将程序集的名称传递给Assembly.Load(),而不是DLL的名称。如果在Reflector中打开DLL,则名称应位于窗口的底部。对于PresentationCore.dll,名称应该类似于PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

答案 2 :(得分:3)

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

对于诊断特定问题,Fusion Log Viewer工具非常棒。 Suzanne Cook,其中一位Fusion开发者在她的博客上有guide,过去曾帮助过我。

答案 3 :(得分:2)

获取字符串的最简单方法是首先添加对项目的引用,然后执行以下操作:

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

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

这将确保您获得作为项目参考添加的正确版本。

答案 4 :(得分:0)

使用GetAssemblyName(http://msdn.microsoft.com/en-us/library/system.reflection.assemblyname.getassemblyname.aspx)获取dll的完全限定程序集名称,并将其传递给Assembly.Load()。