我有一个 win 表单应用程序,我可以为其创建安装程序并进行安装。但是,当涉及一键部署时,它不起作用我收到以下错误。
“应用程序验证未成功。无法继续”
当我单击更多详细信息时,我得到以下信息。
检测到以下故障消息:
- 清单中的引用与下载的程序集 Designer.exe 的标识不匹配。
我尝试了许多不同的修复方法,但都没有成功。
- 我试图用清单创建应用程序。
- 我已经删除了所有先决条件。
- 我还更改了所有要包含的应用程序文件。
有谁知道我该如何解决这个问题?
我有一个 win 表单应用程序,我可以为其创建安装程序并进行安装。但是,当涉及一键部署时,它不起作用我收到以下错误。
“应用程序验证未成功。无法继续”
当我单击更多详细信息时,我得到以下信息。
检测到以下故障消息:
- 清单中的引用与下载的程序集 Designer.exe 的标识不匹配。
我尝试了许多不同的修复方法,但都没有成功。
有谁知道我该如何解决这个问题?
似乎根本找不到任何关于它的信息。
有很多关于这个的信息,只需谷歌错误消息。正确的查询是“清单中的引用与下载的程序集的标识不匹配”,您会发现许多描述解决方法的好结果。
我将尝试做更多的事情,而不仅仅是添加另一个谷歌热门并解释潜在问题。没有人解释真正出了什么问题。希望也有助于涵盖难以诊断的病例。有争议的是可执行文件的一个记录很差的属性,即应用程序清单。请注意,“清单”一词在 Windows 中意味着很多东西,应用程序清单与 ClickOnce 清单不同。
应用程序清单将额外的配置添加到可执行文件中。它们自 Vista 以来非常重要,您需要一个标记您的程序与 UAC 兼容。其他几种用途,您需要条目以使用免注册表 COM、更改 Windows 查找相关 DLL 的方式、禁用 Windows appcompat 垫片或告诉 Windows 8.1 停止谎报其版本号。
与您的问题相关的一个问题是有两种方法可以为可执行文件提供清单。首选方法是将其嵌入到可执行文件本身中。作为非托管资源嵌入。这是使用默认设置构建 Winforms 应用程序时的方式。C# 或 VB.NET 编译器嵌入了一个默认编译器。或者您使用应用程序清单文件项模板添加到项目中的特定文件。嵌入它是首选,因为它限制了清单可能丢失或修改的方式的数量。并且是 Windows 将首先查找的内容。
或者它可以作为一个单独的文件提供,它必须命名为 yourapp.exe.manifest 并存储在与 yourapp.exe 相同的目录中。这是发布向导将执行此操作的方式,您可以在发布文件夹中找到它,它将与可执行文件一起复制到目标计算机。
也许你能闻到迫在眉睫的问题,两个清单并不匹配。System.Deployment 遵循 Windows 规则并首先查找嵌入式清单。它将找到 C# 编译器嵌入的默认值。它根据ClickOnce 清单中声明的身份检查程序集标识。如果不匹配,则 kaboom 带有“清单中的引用与下载的程序集的身份不匹配”。它认为可执行文件在从您的 Web 服务器传输到用户计算机时被中间人攻击替换。
首先查看嵌入在可执行文件 (Designer.exe) 中的非托管资源,即 System.Deployment 首先查看的资源,您开始诊断此问题。在 Visual Studio 中,使用 File + Open + File 并从发布文件夹中选择 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" />
差远了。卡布姆
解决此问题的几种方法:
我的修复是在浏览了 3 天并尝试了一些论坛建议之后出现的。没有什么对我有用。
然后我开始仔细筛选错误消息的详细信息,并注意到中间某处引用了“Invoices.exe”而不是“Invoices.dll”,正如我所期望的那样。然后我记得我最近在我的解决方案中添加了一个名为“Invoices”的新项目,虽然我已经成功发布,但我没有尝试使用发布的解决方案
查看主项目的属性参考页面显示了问题。
除“发票”外,所有其他项目均显示为 dll。我删除了“发票”条目。跳到“发票”项目的属性,在应用程序页面上注意到应用程序输出类型是“Windows 窗体应用程序”
在下拉框中,我选择了“类库”
保存属性 | 重建发票 |
返回到主项目属性参考页面并添加“发票”,这次它显示为 dll,我能够毫无错误地发布。此后,我的应用程序在没有 ["Application Validation did not succeed. Unable to continue"] 错误的情况下加载。
在将我编写的自定义库添加到项目中后,我在带有几个 Microsoft Office 库(Microsoft.Office.Uc、Microsoft.Lync.Models)的 VS 2017 解决方案中遇到了这个问题。
问题(正如@Bones2 所提到的)是我添加了对该自定义库中的 Exe 文件的引用。虽然通常在将自定义库添加到我的测试项目(实际上是一个美化的“Hello World”)时这不会产生任何问题,但我开始得到应用程序验证没有成功。无法继续。在我的生产环境中。这可能是由于围绕 MS Office 的 COM 和互操作库的安全设置(“Assembly 不允许部分受信任的调用方”)。
就我而言,解决方案是删除对 Exe 的引用(应用程序需要它作为实用程序,但从 cmd 调用)并将 exe 添加为 Visual Studio 中的现有项。请注意,完成此步骤后,您还需要转到每个新添加项目的属性并将Build Action设置为Content并将Copy to Output Directory设置为Copy always。