强大的签名组件

问题描述 投票:0回答:10

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

vb.net publish
10个回答
50
投票

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

此错误消息的含义是,在安装之前,当前的发布设置将期望所有相关程序集都存在于目标计算机上的全局程序集缓存中。由于 GAC 中的所有程序集都必须经过强签名,因此任何标记为非强签名先决条件的程序集都会出现此错误。


6
投票

解决方法比这更简单:

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

除非您通过 ClickOnce 部署此应用程序,否则不需要对程序集进行 StrongName。


4
投票

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

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

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

3
投票

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

MSDN:使用强名称签署程序集


2
投票

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

sn -k sgKey.snk

请参阅此链接了解详情

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

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

请参阅此链接了解详情


1
投票

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

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


0
投票

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

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

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


0
投票

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

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


0
投票

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


0
投票

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

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

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

我希望这是有道理的,如果没有让我知道的话。 :)

查看我的博客以获得更详细的解释: 博客文章

问候,雅各布·伊德玛

© www.soinside.com 2019 - 2024. All rights reserved.