部署ClickOnce应用程序时出错-清单中的引用与下载的程序集的标识不匹配


105

我正在尝试部署ClickOnce应用程序,但是在客户端上安装失败。这是错误日志:

PLATFORM VERSION INFO
Windows             : 6.1.7601.65536 (Win32NT)
Common Language Runtime     : 4.0.30319.1
System.Deployment.dll       : 4.0.30319.1 (RTMRel.030319-0100)
clr.dll             : 4.0.30319.1 (RTMRel.030319-0100)
dfdll.dll           : 4.0.30319.1 (RTMRel.030319-0100)
dfshim.dll          : 4.0.31106.0 (Main.031106-0000)

SOURCES
Deployment url          : http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Deployment Provider url     : http://MyProduct.com/Download/Workstation/MyProduct%20Front%20Desk.application
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET
Application url         : http://MyProduct.com/Download/Workstation/Application%20Files/MyProduct%20Front%20Desk_1_0_0_7/MyProduct%20Front%20Desk.exe.manifest
                    Server      : Microsoft-IIS/7.5
                    X-Powered-By    : ASP.NET

IDENTITIES
Deployment Identity     : MyProduct Front Desk.application, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil
Application Identity        : MyProduct Front Desk.exe, Version=1.0.0.7, Culture=neutral, PublicKeyToken=df343a0868ab2d74, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
* Installable application.

ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application resulted in exception. Following failure messages were detected:
    + Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS
* [03/17/11 11:51:04] : Activation of http://MyProduct.com/download/workstation/MyProduct%20Front%20Desk.application has started.
* [03/17/11 11:51:04] : Processing of deployment manifest has successfully completed.
* [03/17/11 11:51:04] : Installation of the application has started.
* [03/17/11 11:51:05] : Processing of application manifest has successfully completed.
* [03/17/11 11:51:06] : Found compatible runtime version 4.0.30319.
* [03/17/11 11:51:06] : Request of trust and detection of platform is complete.

ERROR DETAILS
Following errors were detected during this operation.
* [03/17/11 11:51:30] System.Deployment.Application.InvalidDeploymentException (RefDefValidation)
    - Reference in the manifest does not match the identity of the downloaded assembly MyProductSiteServer.exe.
    - Source: System.Deployment
    - Stack trace:
        at System.Deployment.Application.DownloadManager.ProcessDownloadedFile(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.FileDownloader.DownloadModifiedEventHandler.Invoke(Object sender, DownloadEventArgs e)
        at System.Deployment.Application.SystemNetDownloader.DownloadSingleFile(DownloadQueueItem next)
        at System.Deployment.Application.SystemNetDownloader.DownloadAllFiles()
        at System.Deployment.Application.FileDownloader.Download(SubscriptionState subState)
        at System.Deployment.Application.DownloadManager.DownloadDependencies(SubscriptionState subState, AssemblyManifest deployManifest, AssemblyManifest appManifest, Uri sourceUriBase, String targetDirectory, String group, IDownloadNotification notification, DownloadOptions options)
        at System.Deployment.Application.ApplicationActivator.DownloadApplication(SubscriptionState subState, ActivationDescription actDesc, Int64 transactionId, TempDirectory& downloadTemp)
        at System.Deployment.Application.ApplicationActivator.InstallApplication(SubscriptionState& subState, ActivationDescription actDesc)
        at System.Deployment.Application.ApplicationActivator.PerformDeploymentActivation(Uri activationUri, Boolean isShortcut, String textualSubId, String deploymentProviderUrlFromExtension, BrowserSettings browserSettings, String& errorPageUrl)
        at System.Deployment.Application.ApplicationActivator.ActivateDeploymentWorker(Object state)

COMPONENT STORE TRANSACTION DETAILS
No transaction information is available.

我需要部署的主要exe文件是MyProductFrontDesk.exe,该文件依赖于MyProductSiteServer.exe-,并且似乎是引发错误的位置:“清单中的引用与下载的程序集MyProductSiteServer.exe的标识不匹配。”

哪些清单需要更正?如何?


MySiteServer.exe项目与MyProductFrontDesk.exe是否在同一Visual Studio解决方案中?如果是这样,您的构建配置是否同时选择了两个程序集进行构建?
杰伊

@Jay-是的,在相同的解决方案中,两者都选择构建。
Shaul Behr

Answers:


111

Visual Studio 2008中存在一个问题,该问题可以通过不嵌入默认清单来解决 -该文章中的评论之一表明,该问题仍存在于Visual Studio 2010中。

在项目属性-> 应用程序选项卡-> 资源 ->复选框图标和清单中,设置“使用默认设置嵌入清单”引起了问题。将其设置为“创建没有清单的应用程序”可以解决此问题。


我发现注释488301特别有用:<assemblyIdentity/>可以在自定义.manifest文件中调整自定义清单中的元素(或省略该元素以使编译器发出正确的程序集标识),从而使人们可以指定类似内容<requestedExecutionLevel/>而不会破坏ClickOnce。
13年

4
我的方案是一个GUI应用程序,它需要一个第二个应用程序,即控制台应用程序。如果像我一样,您不想更改默认设置,则手动发布第二个应用程序会创建一个出现在Properties文件夹中的app.manifest,然后再次发布第一个应用程序即可工作,而不必更改嵌入清单的默认设置。
2014年

7
VS 2013遇到相同的问题。此解决方案有效。
EagleBeak 2014年

2
@EagleBeak在VS2013中此菜单在哪里?我没有看到任何有关“创建没有清单的应用程序”的信息
Nefariis 2015年

3
截至2016年6月,正确的答案是配置ClickOnce安全设置(请参阅Mauro发布的答案)。
皮埃尔·阿诺德

57

当我添加对另一个项目的引用时,我遇到了相同的问题。

解决此问题的方法是在所有引用的项目中启用ClickOnce安全设置,如Ian 在此处说明的(重点是我的):

对我来说,解决方法是确保解决方案下所有在其“ 项目属性 ”中显示“ 安全性选项卡 ”的项目均具有选项“ Enable ClickOnce Security Settings ”(带有选项打勾)“ 这是完全信任应用程序 “已选择。这与正确创建清单有关,如果未在需要解决方案的所有项目中都设置了这些选项,则该应用程序将无法安装。

我相信这是在相同解决方案下引用另一个项目时修复它的正确方法。

链接的论坛帖子目前已过期,但可以在此处存档。


1
在尝试了许多解决方案之后,只有该解决方案对我有用。所以我也认为这应该是公认的答案……
Tareq

您可以.cproj使用<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>
VMAtm '17

我在鬼混时禁用了这两个设置https://github.com/Squirrel。当我的(非生产性)ClickOnce部署停止工作时,我已经忘记了这一切。
Walter Stabosz

35

我遇到了同样的问题,但是我的解决方案却大不相同。

我的ClickOnce应用程序在我的解决方案中引用了另一个EXE文件项目,因此当客户端下载该文件时,并且存在另一个EXE文件,则该文件没有清单。

删除对另一个可执行文件的依赖解决了我的问题。


2
我也有两个EXE。删除依赖项将从生成中排除引用的EXE。有没有办法包含它?
Uri Abramson

10
这是我的解决方案。我的主要EXE所引用的项目之一本身就是“ Windows应用程序”。当我将该项目更改为“类库”并重新发布时,一切正常。
克里斯·雷

我在VS2012中使用了@ChrisRay的建议,该程序的安装没有任何困难。谢谢!
罗兰

1
正如用户@Aybe在另一个答案的注释中提到的那样,如果您虚拟发布第二个应用程序,它将获得自己的清单,然后您可以发布第一个应用程序,并且两个程序将一起工作。(就我而言,我有两个程序,一个调用另一个程序。)
Dave Cousineau

对我来说,解决方案实际上是两个(this和@stuartd)-我确实有一个EXE作为参考程序集,它没有清单。但是我无法“删除”此引用,因为我需要使用它。所以我不得不去这个EXE依赖项的项目,应用stuartd的建议。然后,一切正常。
KFL

11

我确认该问题在Visual Studio 2010中也存在。在“项目属性-应用程序-资源”中选择“创建没有清单的应用程序”可以解决此问题。


8
请注意,我必须在错误消息所抱怨的项目上更改此属性,对我来说,这是我实际上试图发布的项目所引用的项目,而不是我实际上试图发布的项目。 。
deadlydog

6

如果您在项目中的不同DLL文件中引用了两个不同版本的NuGet包,则也会发生这种情况。就我而言,我使用的是称为Catel的框架,并且在一个DLL文件中引用的是一个比另一个文件更高的版本(监督),但这导致ClickOnce吐出此错误。引用相同的版本可以解决此问题。


4

我遇到了同样的问题,但是我的解决方案是将“平台目标”更改为“ x86”(项目属性->构建选项卡)。它设置为“任何CPU”。更改设置并重新发布后,ClickOnce安装程序即可完成。


1
非常类似的问题:我启用了“首选32位”。关闭它可以解决问题。
Roman Starkov '16

4

在将项目设置为Debug进行部署时,我遇到了相同的错误。将其更改回Release时,没有错误。


4

我有完全一样的问题。我无法删除主要项目所需的依赖项。第二个项目是一个控制台项目。

我改为Class Library,然后一切正常。


这句话解决了我的问题。谢谢!
casaout's

2

如果无法更改带有错误应用清单的依赖项exe(例如,来自NuGet软件包),则可以采用另一种解决方法。该二进制文件可以包含为具有虚拟扩展名的内容,因此ClickOnce不会尝试验证清单,然后在应用程序启动期间重命名。

csproj:

  <Content Include="..\packages\<package>\lib\<app>.exe">
    <Link><app>.exe.bin</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <ItemGroup>
    <PublishFile Include="<app>">
      <Visible>False</Visible>
      <Group>
      </Group>
      <TargetPath>
      </TargetPath>
      <PublishState>Exclude</PublishState>
      <IncludeHash>True</IncludeHash>
      <FileType>Assembly</FileType>
    </PublishFile>
  </ItemGroup>

App.xaml.cs:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var appDir = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
        if (!File.Exists($"{appDir}\\<app>.exe"))
        {
            File.Copy($"{appDir}\\<app>.exe.bin", $"{appDir}\\<app>.exe");
        }
    }
}

1

我遇到了同样的问题,在这里尝试了所有以前建议的解决方案,但所有解决方案都没有用。

我通过更改更新位置来修复它。从项目属性-> 发布 -> 更新。将更新位置更改为您发布的文件夹。


1

还解决了ClickOnce .exe调用.exe调用.exe的问题。

在Visual Studio 2010中使用VB.NET时,我也遇到了这个问题。

我有一个ClickOnce Windows窗体应用程序,该应用程序引用了第二个Windows窗体应用程序,而该应用程序又引用了第三个Windows窗体应用程序。(为简便起见,这些第二和第三个应用程序是EXE文件而不是DLL文件,因为它们同样有可能独立运行或通过传递给它们的属性来调用。)

我必须分别将第二个和第三个应用程序的清单内容都注释掉:

演练:手动部署ClickOnce应用程序

它完美地工作。


1

如果您有一个引用另一个程序的主程序,则必须对主程序的程序执行“创建没有清单的应用程序”的技巧:

项目->属性->应用程序选项卡->资源->清单->下拉“创建没有清单的应用程序”

然后切换到引用程序的“项目属性”并重复该过程。


0

我在Windows 7上使用Visual Studio 2012,需要发布一个包含两个项目的解决方案。

正如Eduardo指出的那样,将两个项目都标记为ClickOnce,然后启用“完全信任应用程序”即可解决该问题。


0

我有一个其他问题可以解决,所以我想发表。我的问题是我正在TFS中运行3个分支。我已经在一个分支机构升级了Telerik控件,但没有升级其他分支机构。一旦我在所有三个分支中升级了Telerik控件并重新发布,它就可以工作了,这个错误消失了。

我当时正在运行VS2015。


0

挺有趣的。我只是重新部署了应用程序并解决了问题。可能是由于网络导致文件损坏。


0

mage.exe用来生成清单。将其添加到我的.csproj修复问题。您也可以尝试-nowin32manifest 编译器标志;我还没有测试。我在Visual Studio 2017中看不到stuartd的“创建没有清单的应用程序”。我认为这就是它的作用。

<PropertyGroup>
  <NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>

我也有这个.csproj

<GenerateManifests>false</GenerateManifests>

0

在我的Visual Studio 2017版本15.6.6中(但可能早些时候存在),我发现应用程序文件不在右键单击Exe Project and Publish中,而是位于Project Properties Publish选项卡下,您可以在其中设置要放入安装中的应用程序文件的名称。

因此,请排除掉那些有问题的东西。如果将要安装此应用程序的计算机上已经安装了某些软件,则没有任何理由尝试重新安装它,除非您需要参考才能运行它。如果要安装PC上已经安装的软件,但是将其安装到其他文件夹,则可能无法正常工作。最好将其他应用程序或dll程序集用于以前安装的位置。


0

几分钟前我遇到了同样的问题,下面是我用来解决该问题的步骤。

  • a =主项目(您要发布的项目,例如myProduct)
  • b =参考项目(例如MyProductSiteServer)

检查清单

  1. 导航到属性->应用程序->资源->检查图标和清单(对于a和b)

  2. 导航到properties-> Build:确保a和b在同一目标平台上

  3. 导航到属性->安全,并确保a和b选中了以下设置:“启用ClickOnce安全设置”和“这是一个完全信任的应用程序”

  4. 导航到属性->发布:建议您更改发布文件夹的路径


0

我的VS 2019应用程序存在这个完全相同的问题。

我尝试创建没有清单的应用程序,但是没有用。

但是,起作用的是以下内容:

  1. 转到构建->发布->应用程序
  2. 点击“组装信息”按钮
  3. 勾选“使装配COM-可见”选项

希望这会有所帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.