强名称程序集

27

我有一个用Visual Basic 2008 Express制作的项目。我将它从别人的C#项目转换过来,但是它可以运行。它有几个DLL依赖项。我想发布我的项目,以便在另一台机器上安装它,但对于每个DLL,都会出现一个错误:“程序集必须进行强名称签名才能标记为先决条件。”我做了一些研究,但没有找到很多信息,并且我找到的信息我不太理解。这个错误是什么意思?最好的解决方法是什么?还有一件事:我花了很长时间才能使所有的dll正确引用,所以我不希望解决方案与移动DLL有关,因为那可能会破坏我的主项目的功能。

10个回答

50
如果您使用 ClickOnce 进行发布,请转到发布页面,然后单击“应用程序文件”。 从那里,您应该可以看到 DLL 的列表。 确保给您带来麻烦的 DLL 其发布状态标记为“包括”,而不是“先决条件”。
此错误消息的含义是,当前的发布设置将期望在目标计算机上安装之前所有相关程序集都存在于全局程序集缓存中。由于 GAC 中的所有程序集必须具有强名称签名,因此任何被标记为先决条件但未强名称签名的程序集都会导致此错误。

1
我已经查看了属性中的每个选项卡并单击了每个按钮,但仍然找不到它。我的发布页面有位置组合框、语言下拉菜单、版本号和3个按钮——先决条件、更新和“立即发布”。先决条件是像.NET 3.5这样的东西。没有列出任何我的dlls。 - CoderDennis
我投票太早了。我将所有设置都更改为“包括”,但我的两个程序集仍然存在此问题。 - David Morton
@David:所涉及的程序集(以及正确的版本)是否列在先决条件中? - Adam Robinson
+1 - 这并不完全是我的问题,但是你的跟进解释打开了一些门,导致我找到了解决方案。正是我所需要的! - Unsliced
如果这对你不起作用:请确保所有程序集都包含在发布版本中!特别是当针对特定平台时,您包含的某些程序集可能实际上未在配置管理器中进行检查。很蠢,但它让我走到了最后一步。 - System.Cats.Lol
显示剩余3条评论

6

解决方法比那个更简单:

  1. 进入你的项目。
  2. 右键点击并选择属性。
  3. 去到安全选项卡。
  4. 取消勾选启用 ClickOnce 安全设置。

除非你通过 ClickOnce 部署此应用程序,否则不需要强名称你的程序集。


4
强名称程序集主要是指由加密密钥签名的程序集。在Visual Studio中实现这个过程非常简单,而且不需要重新排序依赖项。
我正在使用非Express版本的Visual Studio,因此您可能需要稍微调整一下步骤。
- 右键单击项目并选择属性 - 单击“签名”选项卡 - 选中“签署程序集” - 在组合框中选择“<新建...>” - 完成向导 - 重新构建

我曾经这样做过,似乎有点帮助。但是,然后它出现了另一个依赖项的错误。我忘记了确切的措辞,但我再次使用“<New...>”并浏览该依赖项,现在我收到一个错误:“创建程序集清单时出错:提供程序版本不正确”。 - Jason Shoulders
@Jason,你在哪里看到那个消息?是对话框还是构建错误? - JaredPar
这是底部错误选项卡中的构建错误。我认为浏览该依赖关系不是正确的操作,现在我无法摆脱该引用。 - Jason Shoulders

3

1
实际上,在我回答之前的研究中,我遇到了那个页面,而那是我不理解的页面之一。 - Jason Shoulders

2

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

sn -k sgKey.snk

有关详细信息,请参阅此链接

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

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

请参考此链接了解详情。

1

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

删除错误的程序集引用,然后再次添加它。


0

检查目标框架是否实际设置为3.5或您想要的任何框架。有时,如果未正确设置,它会出现错误。


0

我也遇到了这个问题。在我的解决方案中引用了blabla.dll,但是blabla.dll也被另一个.dll使用,而我在项目中引用了该.dll。

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

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

希望这有意义,如果没有,请让我知道。:)

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

敬礼,Jacob Iedema


0

使用Adam Robinson的解决方案让我成功发布了项目,但是我发现用户在安装时会遇到问题,因为最终用户系统会提示无法安装,指出硬盘空间不足。由于这似乎极不可能是根本原因,所以我进一步调查了一下。

显然,我的问题的基础是我的一个引用还引用了一个与我的项目使用的.dll不同版本的.dll。ClickOnce不能处理这个问题,并拒绝将第二个版本的.dll复制到用户的系统中,引用已经存在的版本。将.dll和项目引用同一个版本的其他.dll可以消除错误并解决安装问题。


0

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

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

然后我使用记事本将其删除,现在一切都好了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接