我使用C#创建了一个窗口应用程序。我正在发布成功的应用程序。
我看到一些关于设置项目的解决方案,该解决方案自动与下面相同
我不想把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
答案 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的两个版本,则这将是错误的根本原因之一。