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