该应用程序需要将程序集...安装在全局程序集缓存中

时间:2016-03-11 10:18:29

标签: c# winforms visual-studio-2013 publishing global-assembly-cache

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

当我尝试安装应用程序时,它显示以下错误。enter image description here

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

enter image description here

我不想把dll放在GAC中。

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

我已经浏览了以下网址

Error message "Unable to install or run the application. The application requires stdole Version 7.0.3300.0 in the GAC"
Unable to install or run the application: Click Once

4 个答案:

答案 0 :(得分:6)

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

还有另一个原因导致装配体无法在文件之外加载而根本不存在。当存在错误版本的程序集时,它也将失败。换句话说,程序集的[AssemblyVersion]与编译程序的程序不匹配。

查看属性声明in the library显示:

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

请注意属性中的*。这是一个非常糟糕的主意。看起来像作者喜欢语义版本,但不足以信任它以正确跟踪项目的变化。 *在构建时被一个看似随机的数字替换,在你的情况下为21129。它不是随机的,而是从一天中的时间得出的。午夜以来的秒数/秒。您可以从糟糕的错误消息中推断出它需要在早上11:44:18建立的那个并且可能找到另一个。

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

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

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

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

答案 1 :(得分:1)

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

stdole.dll的文件名 将状态发布到Include 将组下载到必需 之后,您需要重新发布您的申请。

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

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

答案 2 :(得分:0)

我也遇到了这个问题。

基本上ClickOnce默认为" Publish Status = Prerequiste"对于GAC的依赖关系,您必须手动设置包含。 (这就是其他帖子的内容,但这不是你的问题)。

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

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文件。这是一个zip文件。您可以提取它并检查.rsrc\version.txt是否包含与.text文件相同的版本(在文本编辑器中打开并滚动到结尾)。

答案 3 :(得分:0)

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

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