【问题标题】:Strong Signed Assemblies强签名程序集
【发布时间】:2009-04-06 13:01:33
【问题描述】:

我有一个使用 Visual Basic 2008 Express 制作的项目。我从别人的 C# 项目中转换了它,但它可以工作。它有几个 DLL 依赖项。我去发布我的项目,以便可以将它安装在另一台机器上,并且对于每个 DLL,我收到一个错误:“程序集必须经过强签名才能被标记为先决条件。”我做了一些研究,但没有找到很多东西,而且我发现的东西我并不真正理解。这个错误是什么意思?解决它的最佳方法是什么?另一件事:我花了很长时间才能正确引用我的所有 dll,所以我更喜欢该解决方案与移动 DLL 无关,因为这可能会破坏我的主项目中的功能。

【问题讨论】:

    标签: vb.net compiler-construction publishing


    【解决方案1】:

    如果您通过 ClickOnce 发布,请转到发布页面并单击“应用程序文件”。从那里你应该看到你的 DLL 的列表。确保给您带来麻烦的那些将其发布状态标记为“包含”而不是“先决条件”。

    此错误消息的意思是,当前的发布设置将期望所有有问题的程序集都存在于目标计算机上的全局程序集缓存中,然后才能进行安装。由于 GAC 中的所有程序集都必须是强签名的,因此任何标记为未强签名的先决条件的程序集都会出现此错误。

    【讨论】:

    • 听起来不错,但我找不到发布页面或“应用程序文件”。我怎么去那里?
    • 项目右键,选择“属性”。
    • 我查看了每个选项卡并单击了“属性”中的每个按钮,但找不到它。我的发布页面有位置组合框、语言下拉菜单、版本号和 3 个按钮——先决条件、更新和“立即发布”。先决条件是 .NET 3.5 之类的东西。不列出我的任何 dll。
    • +1 解决了 VS 2005 中包含安装程序组件的 c# 项目(windows 服务)的类似问题 - 实际上,错误出现在编译时,我自己没有触及或考虑应用程序属性中的任何“发布”设置...
    • 我投了这个票太早了。我将所有设置更改为包括,但我的两个程序集仍然存在此问题。
    【解决方案2】:

    解决方法比这更简单:

    1. 转到您的项目。
    2. 右键单击并选择属性。
    3. 转到“安全”选项卡。
    4. 取消选中启用 ClickOnce 安全设置。

    除非您通过 ClickOnce 部署此应用程序,否则您不需要为您的程序集命名。

    【讨论】:

      【解决方案3】:

      强命名程序集主要是由加密密钥签名的程序集。使用 Visual Studio 很容易做到这一点,并且不需要重新排序依赖项。

      我使用的是非 Express Visual Studio,因此步骤对您来说可能略有不同。

      • 右键单击项目并选择属性
      • 单击“签名”选项卡
      • 选中“签署程序集”
      • 在组合框中选择“”
      • 完成向导
      • 重建

      【讨论】:

      • 我做过一次,似乎有点帮助。但是,然后它给出了关于另一个依赖项的错误。我忘记了确切的措辞,但我再次执行了“”并浏览了该依赖项,现在我收到一个错误:“创建程序集清单时出错:提供程序的错误版本”。
      • @Jason 您在哪里看到该消息?是对话框还是构建错误?
      • 这是错误选项卡@底部的构建错误。我认为浏览该依赖项不是正确的做法,现在我无法摆脱引用。
      【解决方案4】:

      查看此链接...它包含使用强名称对程序集进行签名的说明:

      MSDN: Signing an Assembly with a Strong Name

      【讨论】:

      • 其实,在我回答之前,我在研究过程中遇到了那个页面,这是我不理解的页面之一。
      【解决方案5】:

      要创建一个强名称,只需转到 SDK 命令提示符或 Visual Studio 200X 命令提示符,然后输入以下内容

      sn -k sgKey.snk
      

      参考this link for details

      然后通过运行以下命令将强名称关联到您的程序集

      al /out:MyAssembly.dll MyOldAssembly.dll /keyfile:sgKey.snk
      

      参考this link for details

      【讨论】:

        【解决方案6】:

        在上述解决方案失败后,这对我有用:

        删除对错误程序集的引用,然后重新添加。

        【讨论】:

          【解决方案7】:

          我发现我的问题出在 .csproj 文件中

          <Reference Include="OtherProjectNothingToDo">
            <HintPath>..\..\..\..\Pedidos\XBAP\Pedidos\Pedidos\bin\Release\Pedidos.exe</HintPath>
          </Reference>
          

          然后我用记事本删除它,现在可以了。

          【讨论】:

            【解决方案8】:

            使用Adam Robinson's 解决方案允许我发布,但我发现项目发布后用户无法安装项目,因为最终用户系统会抱怨无法安装,并注意硬盘空间。由于这似乎不太可能是根本原因,因此我进一步研究了它。

            显然,我的问题的基础是我的引用之一也引用了我的项目使用的 .dll,但版本不同。 ClickOnce 没有这个,并拒绝将 .dll 的第二个版本复制到用户的系统,引用该版本已经存在。修复它,使 .dll 和项​​目引用另一个 .dll 的相同版本消除了错误并更正了安装问题。

            【讨论】:

              【解决方案9】:

              检查目标框架是否实际设置为 3.5 或您想要定位的任何框架。有时设置不正确会报错。

              【讨论】:

                【解决方案10】:

                我也遇到了这个问题。在我的情况下,我的解决方案中引用了 blabla.dll,但我在项目中引用的 another.dll 中也使用了 blabla.dll。

                在检查两个 blabla.dll 的版本时,它们并不相同。所以我用正确的 blabla.dll 更新了 another.dll,然后在我的解决方案中引用了新的 another.dll。错误消失了。

                简而言之:我使用了 2 个版本的 blabla.dll

                如果不告诉我,我希望这是有道理的。 :)

                查看我的博客以获得更详细的解释: Blog article

                问候,雅各布·伊德玛

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-11-06
                  • 1970-01-01
                  • 2013-07-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多