27

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

4

10 回答 10

50

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

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

于 2009-04-06T13:05:04.890 回答
6

解决方法比这更简单:

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

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

于 2012-08-23T14:15:08.930 回答
4

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

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

  • 右键单击项目并选择属性
  • 单击“签名”选项卡
  • 选中“签署程序集”
  • 在组合框中选择“<新建...>”
  • 完成向导
  • 重建
于 2009-04-06T13:07:15.697 回答
3

检查此链接...它具有使用强名称签署程序集的说明:

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

于 2009-04-06T13:06:02.080 回答
2

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

sn -k sgKey.snk

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

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

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

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

于 2009-04-06T13:09:49.187 回答
1

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

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

于 2010-07-09T10:00:56.340 回答
0

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

于 2010-06-30T17:01:19.670 回答
0

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

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

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

于 2011-12-09T23:35:57.403 回答
0

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

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

于 2012-11-10T00:05:30.887 回答
0

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

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

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

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

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

问候, 雅各布·伊德玛

于 2013-10-07T13:35:49.273 回答