我有一个win表单应用程序,我可以为其安装和安装。但是,当单击部署时,它无法正常工作,我会收到以下错误。
“应用验证未成功。无法继续”
当我点击更多细节时,我得到以下内容。
检测到以下失败消息:
- 清单中的引用与下载的程序集Designer.exe的标识不匹配。
我尝试了许多不同的修复但没有成功。
有谁知道如何解决这个问题?
答案 0 :(得分:11)
根本无法找到有关它的任何信息。
有很多关于此的信息,只是google错误消息。正确的查询是“清单中的引用与下载的程序集的标识不匹配”,您将找到许多描述变通方法的好点击。
我会尝试做的不只是添加另一个谷歌点击并解释潜在的问题。没有人解释真的出错了什么。并希望有助于涵盖难以诊断的病例。问题是可执行文件应用程序清单的文档记录很差。请注意,“清单”一词在Windows中意味着很多东西,应用程序清单与ClickOnce清单不同。
应用程序清单将额外配置添加到可执行文件中。它们非常重要,因为Vista,你需要一个标记你的程序与UAC兼容。其他一些用途,您需要使用条目来使用无注册表的COM,改变Windows查找依赖DLL的方式,禁用Windows appcompat填充程序或告诉Windows 8.1停止说谎其版本号。
与您的问题相关的一个问题是两种方式为可执行文件提供清单。首选方法是将其嵌入可执行文件本身。嵌入为非托管资源。这是使用默认设置构建Winforms应用程序时的方法。 C#或VB.NET编译器嵌入了默认编译器。或者使用Application Manifest File项目模板添加到项目中的特定项目。嵌入它是首选,因为限制了清单可能丢失或修改的方式的数量。这是Windows首先要寻找的。 p>
或者它可以作为单独的文件提供,它必须命名为yourapp.exe.manifest并存储在与yourapp.exe相同的目录中。这是发布向导执行此操作的方式,您可以在发布文件夹中找到它,并将其与可执行文件一起复制到目标计算机。
也许你可以闻到迫在眉睫的问题,两个清单并且它们不匹配。 System.Deployment遵循Windows规则,首先查找嵌入式清单。它将找到C#编译器嵌入的默认值。它根据 ClickOnce清单中声明的程序集检查程序集标识。如果它不匹配,则kaboom“清单中的引用与下载的程序集的标识不匹配”。它认为可执行文件在通过中间人攻击从Web服务器传输到用户机器时被替换。
首先查看嵌入在可执行文件(Designer.exe)中的非托管资源,即System.Deployment首先查看的资源,开始诊断此问题。在Visual Studio中,使用File + Open + File并从publish文件夹中选择Designer.exe。它可能类似于:
ID为#1的RT_MANIFEST条目是嵌入式应用程序清单。您可以双击它以查看,但您将获得内容的十六进制转储。更容易的是右键单击,导出并指定.txt文件名,以便您可以使用文本编辑器查看它。它将类似于这样的东西:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
<assemblyIdentity>
元素是麻烦制造者。请注意它是如何具有通用名称“MyApplication.app”和默认版本号1.0.0.0。如果查看发布向导生成的yourapp.exe.manifest文件,您将看到如下内容:
<asmv1:assemblyIdentity name="WindowsFormsApplication86.exe" version="1.0.0.0"
publicKeyToken="e939ba736dc34835" language="neutral"
processorArchitecture="msil" type="win32" />
甚至没有关闭。 KABOOM
解决此问题的几种方法:
答案 1 :(得分:0)
我的修复,经过3天的浏览并尝试了一些论坛建议。没有什么对我有用。
然后我开始仔细筛选错误消息的详细信息,并注意到中间的某个位置引用了&#34; Invoices.exe&#34;而不是&#34; Invoices.dll&#34;正如我所料。然后我记得我最近在我的解决方案中添加了一个名为&#34; Invoices&#34;虽然我已成功发布,但自从
以来我没有尝试使用已发布的解决方案查看主项目的属性参考页面显示了问题。
Main Project | Properties | References
所有其他项目均显示为dll,但&#34; Invoices&#34;。我删除了&#34;发票&#34;条目。跳转到&#34; Invoices&#34;项目和应用程序页面上注意到应用程序输出类型是&#34; Windows窗体应用程序&#34;
Invoices | properties | Application
在下拉框中,我选择了&#34; 类库&#34;代替
保存属性|重建发票|
返回主项目属性引用页面并添加&#34; Invoices&#34;,这次它显示为dll,我能够无错误地发布。此后我的应用程序加载了[&#34;应用程序验证未成功。无法继续&#34;]错误。
答案 2 :(得分:0)
在添加了我编写到项目中的自定义库之后,我在带有几个Microsoft Office库(Microsoft.Office.Uc,Microsoft.Lync.Models)的VS 2017解决方案中遇到了此问题。
问题(由@ Bones2暗示)是我从该自定义库添加了对Exe文件的引用。虽然通常在将自定义库添加到测试项目中时不会产生任何问题(实际上是美化的“ Hello World”),但我开始得到应用程序验证未成功的信息。无法继续。在我的生产环境中。这可能是由于MS Office的COM和互操作库周围的安全设置(“程序集不允许部分受信任的调用方”)。
在我的情况下,解决方案是删除对Exe的引用(应用程序需要将其作为实用程序使用,但从cmd调用),并将该exe添加为Visual Studio中的现有项。请注意,完成此步骤后,还需要转到每个新添加项目的属性,并将 Build Action 设置为 Content 和复制到输出目录以始终复制。