9

我使用 C# 创建了一个窗口应用程序。我正在发布成功的应用程序。

当我尝试安装应用程序时,它显示以下错误。在此处输入图像描述

我看到了一些关于设置项目的解决方案,它自动与下面相同

在此处输入图像描述

我不想将 dll 放在 GAC 中。

对此有任何建议或解决方案。

我浏览了以下网址

错误消息“无法安装或运行应用程序。应用程序需要 GAC 中的 stdole 版本 7.0.3300.0”
无法安装或运行应用程序:单击一次

4

4 回答 4

6

这是一条 ClickOnce 错误消息,它告诉您它无法找到 JamaaTech.Smpp.Client.Net.Lib.v1.4.dll 程序集。这是一个特别笨拙的错误消息,您当然不想在 ClickOnce 中使用 GAC。它并没有告诉你真正的问题,你没有机会诊断问题。您知道程序集存在,您肯定将它包含在部署包中,为什么找不到它?

除了文件不存在之外,无法加载程序集还有另一个原因。当存在错误版本的程序集时,它也会失败。换句话说,程序集的 [AssemblyVersion] 与您编译程序时使用的不匹配。

查看中的属性声明显示:

[assembly: AssemblyVersion("1.4.3.*")]
[assembly: AssemblyFileVersion("1.4.3.1")]

注意*属性中的 。这是一个非常糟糕的主意。看起来作者喜欢语义版本控制,但不够信任它以正确跟踪项目的更改。在*构建时被一个看似随机的数字取代,在你的例子中是 21129。它不是随机的,它来自一天中的时间。自午夜以来的秒数 / 2。您可以从糟糕的错误消息中推断出它想要在早上 11:44:18 构建的那个,并且可能找到了另一个。

这种方法可能出错的是您的 WindowsFormsApplication1 项目中的两个引用。您很可能已将这些程序集的调试版本添加为参考。一切正常,您在调试应用程序时从未注意到问题。但是,当您构建应用程序的发布版本时,就像 ClickOnce 发布一样,您现在会有版本不匹配,这些程序集的发布版本具有随机不同的版本号,并且与参考程序集的版本不匹配。

解决此问题的两种基本方法,我建议您同时使用:

  • 摆脱可怕的随机数生成器并编辑 [AssemblyVersion] 属性。有两个,一个在 JamaaTech.SMPP.Net.Lib/Properties/AssemblyInfo.cs 源文件中,另一个在 JamaaTech.SMPP.Net.Lib/Properties/AssemblyInfo.cs 源文件中。只需将它们与[AssemblyFileVersion]相同,至少您可以在使用资源管理器查看文件时看到版本号。

  • 你必须修复你的解决方案。如果您还没有这样做(您可能已经这样做了),请从 Codeplex 存储库下载源代码并将这两个项目添加到您的解决方案中。使用文件 > 添加 > 现有项目。删除 WindowsFormsApplication1 项目中的程序集引用,它们肯定是坏的,然后将它们添加回来,现在选择一个项目引用。这确保程序集始终在您的 WindowsFormsApplication1 项目之前构建,因此它始终使用正确的引用和正确的版本号。请确保 Application Files 对话框中的两个 DLL 来自项目的 Release 构建目录。

于 2016-03-14T07:24:27.673 回答
1

尝试转到项目属性中的“发布”选项卡,然后选择“应用程序文件”按钮。然后设置以下属性:

stdole.dll 的文件名 发布状态以包括下载组为必需 之后您需要重新发布您的应用程序。

如果引用的 CopyLocal=true,则引用将随应用程序一起发布。如果引用的 CopyLocal=false,则该引用将被标记为先决条件。这意味着在安装 ClickOnce 应用程序之前,必须将程序集安装在客户端的 GAC 中。

由于 Visual Studio 安装而不是 .NET Framework 安装,一些程序集安装到 GAC 中。这可能是你的情况。

于 2016-03-19T17:54:04.123 回答
0

我碰巧抱怨 NLog.dll,我发现我的应用程序引用了 Nlog.dll 的一个版本,而我的库项目引用了 Nlog.dll 的另一个版本,并且清单将一个版本列为依赖项(安装),将另一个版本列为依赖项(必要条件,即需要存在于系统中,甚至复制到本地设置为 true)。

底线:如果在依赖项目中引用了相同 dll 的两个版本,那么这将是错误的根本原因之一。

于 2018-10-04T19:03:57.530 回答
0

我也遇到了这个问题。

基本上,对于来自 GAC 的依赖项,ClickOnce 默认为“Publish Status = Prerequiste”,您必须手动设置 Include。(这就是其他帖子的内容,但这不是您的问题)。

我的猜测是您的依赖项的引用方式有问题。

a) 删除对的引用JamaaTech.Smpp.Net.Lib.v.1.4并再次添加。(有时项目引用搞砸了,依赖项是从引用 bin 文件夹中引用的,而不是它自己的可能已经过时的)。

b) 确保为该Copy Local = True参考设置。

c) 尝试从命令行发布您的应用程序,msbuild.exe /target:rebuild;publish yourproject.csproj以确保构建干净。

(这不支持网络发布,但您可以在本地发布并通过 ftp 部署)https://stackoverflow.com/a/20405626/98491

d) 发布后确保在发布位置Application Files文件夹中找到一个JamaaTech.Smpp.Net.Lib.v.1.4文件。这是一个压缩文件。您可以提取它并检查它是否.rsrc\version.txt包含与文件相同的版本.text(在文本编辑器中打开并滚动到结尾)。

于 2016-03-14T07:52:34.143 回答