【问题标题】:How would I load an assembly from the GAC?我将如何从 GAC 加载程序集?
【发布时间】:2009-06-15 19:28:46
【问题描述】:

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

当我尝试这个时:

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

我收到 FileNotFoundExceptionAnother answer on SO 建议我使用 Assembly.LoadFrom() 来完成此操作 - 我很犹豫,因为根据 Visual Studio 2008,Assembly.LoadFrom() 已被弃用 - 另外,它似乎并没有实际工作。

有什么想法吗?

【问题讨论】:

    标签: c# .net-3.5


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • +1 好点 - 这是程序集的逻辑名称 - 而不是物理文件名 - 这是需要的
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-14
            • 2010-12-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-09
            相关资源
            最近更新 更多