VS 2010一键部署问题“应用程序验证未成功。无法继续”

时间:2014-02-11 08:54:43

标签: c# deployment oneclick

我有一个win表单应用程序,我可以为其安装和安装。但是,当单击部署时,它无法正常工作,我会收到以下错误。

  

“应用验证未成功。无法继续”

当我点击更多细节时,我得到以下内容。

检测到以下失败消息:

  
      
  • 清单中的引用与下载的程序集Designer.exe的标识不匹配。
  •   

我尝试了许多不同的修复但没有成功。

  • 我尝试使用清单创建应用程序。
  • 我已删除所有先决条件。
  • 我还更改了要包含的所有应用程序文件。

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:11)

  

根本无法找到有关它的任何信息。

有很多关于此的信息,只是google错误消息。正确的查询是“清单中的引用与下载的程序集的标识不匹配”,您将找到许多描述变通方法的好点击。

我会尝试做的不只是添加另一个谷歌点击并解释潜在的问题。没有人解释真的出错了什么。并希望有助于涵盖难以诊断的病例。问题是可执行文件应用程序清单的文档记录很差。请注意,“清单”一词在Windows中意味着很多东西,应用程序清单与ClickOnce清单不同。

应用程序清单将额外配置添加到可执行文件中。它们非常重要,因为Vista,你需要一个标记你的程序与UAC兼容。其他一些用途,您需要使用条目来使用无注册表的COM,改变Windows查找依赖DLL的方式,禁用Windows appcompat填充程序或告诉Windows 8.1停止说谎其版本号。

与您的问题相关的一个问题是两种方式为可执行文件提供清单。首选方法是将其嵌入可执行文件本身。嵌入为非托管资源。这是使用默认设置构建Winforms应用程序时的方法。 C#或VB.NET编译器嵌入了默认编译器。或者使用Application Manifest File项目模板添加到项目中的特定项目。嵌入它是首选,因为限制了清单可能丢失或修改的方式的数量。这是Windows首先要寻找的。

或者它可以作为单独的文件提供,它必须命名为yourapp.exe.manifest并存储在与yourapp.exe相同的目录中。这是发布向导执行此操作的方式,您可以在发布文件夹中找到它,并将其与可执行文件一起复制到目标计算机。

也许你可以闻到迫在眉睫的问题,两个清单并且它们不匹配。 System.Deployment遵循Windows规则,首先查找嵌入式清单。它将找到C#编译器嵌入的默认值。它根据 ClickOnce清单中声明的程序集检查程序集标识。如果它不匹配,则kaboom“清单中的引用与下载的程序集的标识不匹配”。它认为可执行文件在通过中间人攻击从Web服务器传输到用户机器时被替换。

首先查看嵌入在可执行文件(Designer.exe)中的非托管资源,即System.Deployment首先查看的资源,开始诊断此问题。在Visual Studio中,使用File + Open + File并从publish文件夹中选择Designer.exe。它可能类似于:

enter image description here

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


解决此问题的几种方法:

  • 在可执行文件的File + Open + File视图仍然打开的情况下,右键单击清单ID#1并选择Delete。完全删除它,System.Deployment现在将找到该文件
  • 项目+属性,应用程序选项卡,将清单选项更改为“创建没有清单的应用程序”。这应该是您的首选解决方案
  • 如果您需要自定义清单并使用了应用程序清单文件,则必须再次将其删除,而是编辑发布向导生成的yourapp.exe.manifest文件。这是非常痛苦的,最好避免,因为你需要反复这样做
  • 更新您的VS版本,此问题已得到修复,现在它已经足够智能,可以在您发布时重建您的项目,现在没有默认清单。我认为从VS2012开始,绝对是VS2013。

答案 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 复制到输出目录始终复制