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

Ink*_*key 11 c# deployment oneclick

我有一个win表单应用程序,我可以为其安装和安装.但是,当单击部署它不起作用时,我得到以下错误.

"应用程序验证未成功.无法继续"

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

检测到以下失败消息:

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

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

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

有谁知道我怎么能解决这个问题?

Han*_*ant 11

似乎根本找不到有关它的任何信息.

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

我会尝试做的不仅仅是添加另一个谷歌点击并解释潜在的问题.没有人能解释什么是真正的错误.并希望有助于涵盖难以诊断的病例.问题是可执行文件(应用程序清单)的文档记录很差.请注意,"清单"一词在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.它可能类似于:

在此输入图像描述

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>
Run Code Online (Sandbox Code Playgroud)

<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" /> 
Run Code Online (Sandbox Code Playgroud)

差远了.KABOOM


解决此问题的几种方法:

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