无法访问安装到GAC中的程序集

时间:2009-12-10 15:41:06

标签: asp.net gac

如果这是一个愚蠢的问题,我很抱歉,但我已经花了两天时间,而且无法让它发挥作用。 这是我做的:

  1. 创建新的类库项目
  2. 添加了一个返回字符串
  3. 的简单方法sayHi()
  4. 在项目属性中选中“签署程序集”并使用强名称密钥文件
  5. 编译应用程序并将DLL复制到c:\ windows \ assemblies(我也尝试使用具有类似结果的gacutil工具)
  6. 在machine.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" />中添加了以下内容。这很好用,因为如果我拼错了程序集名称,任何.net应用程序都会失败并抱怨该行。
  7. 在.NET框架配置工具中使用程序集缓存查看器,我可以在缓存中看到程序集。
  8. 现在,当我尝试使用它时,当我执行using gacTestClassgacTestClass.gacTest.sayHi()时,我的应用程序失败了。我收到一条错误消息,指出无法找到类型或命名空间。
  9. 感谢任何帮助。

    编辑:

    好的,我遵循了一个建议,我将尝试使用web.config,而不是machine.config。

    我将以下内容添加到我的web.config <compilation><assemblies><add assembly="gacTestClass, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31418215e131202e" />中,并确保通过拼写错误名称并观看应用程序失败来实现。 现在,当我尝试将using gacTestClass添加到我的.cs文件的顶部时,我收到一条错误消息,指出无法找到类型或命名空间。

    以防万一,这是gacTestClass的代码

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    [assmbly:AssemblyKeyFile("sayHi.snk")]
    namespace gacTestClass {
        public class gacTest {
            public string sayHi() {
                return "Hello there!";
            }
        }
    }
    

2 个答案:

答案 0 :(得分:4)

试试这个:

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="Namespace" publicKeyToken="token" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0" newVersion="1.1.0.0" />
  </dependentAssembly>
</assemblyBinding></runtime>

将编译部分从machine.config移到web.config并尝试一下。它应该在machine.config中正常工作,但我认为如果你是GAC一个程序集,许多应用程序将使用它。您将希望每个应用程序能够选择要使用的DLL版本(以便更轻松地升级路径)。

此外,似乎很明显,但请确保您尝试访问的方法(gacTestClass.gacTest.sayHi())是公开的。

答案 1 :(得分:3)

编辑:尝试右键单击项目,单击“添加引用”,然后添加DLL文件。

通常,您不应该修改machine.config