【问题标题】:Error deploying ClickOnce application - Reference in the manifest does not match the identity of the downloaded assembly部署 ClickOnce 应用程序时出错 - 清单中的引用与下载的程序集的标识不匹配
【发布时间】:2011-07-17 06:50:44
【问题描述】:

我正在尝试部署 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 - 是的,在同一个解决方案中,都选择构建。

标签: c# visual-studio-2010 clickonce


【解决方案1】:

an issue with Visual Studio 2008 which is solved by not embedding the default manifest - 那篇文章中的一个 cmets 表明问题在 Visual Studio 2010 中仍然存在。

在项目属性 -> Application 选项卡 -> Resources -> 复选框 Icon and manifest,设置“使用默认设置嵌入清单”导致问题。将其设置为“创建没有清单的应用程序”可以解决问题。

【讨论】:

  • 我发现comment 488301 特别有用:自定义清单中的<assemblyIdentity/> 元素可以在您的自定义.manifest 文件中进行调整(或省略以让编译器发出正确的程序集标识),从而启用一个可以在不破坏 ClickOnce 的情况下指定 <requestedExecutionLevel/> 之类的内容。
  • 我的场景是一个 GUI 应用程序,它需要一个控制台应用程序的第二个应用程序。如果像我一样,您不想更改默认设置,手动发布第二个应用程序会创建一个 app.manifest 出现在 Properties 文件夹中,然后再次发布第一个应用程序可以正常工作,而无需更改嵌入清单的默认设置。
  • 在 VS 2013 上遇到了同样的问题。这个解决方案奏效了。
  • @EagleBeak 这个菜单在 VS2013 中在哪里?我没有看到任何关于“创建没有清单的应用程序”
  • 截至 2016 年 6 月,正确答案是配置 ClickOnce 安全设置(请参阅 Mauro 发布的答案)。
【解决方案2】:

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

解决这个问题的方法是在所有引用的项目中启用 ClickOnce 安全设置,正如 Ian 解释的 here(强调我的):

对我来说,解决这个问题的方法是确保解决方案下的所有项目在其“项目属性”中暴露了“安全选项卡”选项“启用 ClickOnce 安全设置”勾选了选项“这是一个完全信任的应用程序”。这与正确创建清单有关,如果未在解决方案中需要它的所有项目上设置这些选项,应用程序将无法安装。

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

链接的论坛帖子现已过期,但可以在存档here 上找到它。

【讨论】:

  • 在尝试了这么多解决方案之后,只有这个解决方案对我有用。所以我也认为这应该是公认的答案......
  • 你可以用<PropertyGroup><TargetZone>LocalIntranet</TargetZone></PropertyGroup>修改.cproj文件来做同样的事情
  • 我在玩https://github.com/Squirrel 的时候禁用了这两个设置。当我的(非生产)ClickOnce 部署停止工作时,我已经忘记了这一切。
【解决方案3】:

我遇到了同样的问题,但我的解决方案非常不同。

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

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

【讨论】:

  • 我也有两个EXE。删除依赖项会从构建中排除引用的 EXE。有没有办法包含它?
  • 这就是我的解决方案。我的主要 EXE 引用的项目之一本身就是一个“Windows 应用程序”。当我将该项目更改为“类库”并重新发布时,一切正常。
  • 我在VS2012中使用了@ChrisRay的建议,程序安装没有任何困难。谢谢!
  • 正如用户@Aybe 在另一个答案的 cmets 中提到的那样,如果您虚拟发布第二个应用程序,它将获得自己的清单,然后您可以发布第一个应用程序,两个程序将一起工作。 (就我而言,我有两个程序,一个调用另一个。)
  • 对我来说解决方案确实是(this 和@stuartd)——我确实有一个 EXE 作为参考程序集,它没有清单。但我不能“删除”这个引用,因为我需要使用它。所以我不得不去这个EXE依赖的项目,应用stuartd的建议。然后一切正常。
【解决方案4】:

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

【讨论】:

  • 请注意,我必须在错误消息所抱怨的项目上更改此属性,对我来说,这是我实际尝试发布的项目引用的项目,而不是我实际上试图发布的项目。
【解决方案5】:

在将项目设置为“调试”进行部署时,我遇到了同样的错误。当它改回 Release 时没有错误。

【讨论】:

    【解决方案6】:

    如果您在项目的不同 DLL 文件中引用了两个不同版本的 NuGet 包,也会发生这种情况。在我的例子中,我使用了一个名为 Catel 的框架,并且我在一个 DLL 文件中引用了一个比另一个(疏忽)更新的版本,但这导致 ClickOnce 吐出这个错误。引用相同的版本解决了这个问题。

    【讨论】:

      【解决方案7】:

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

      【讨论】:

      • 非常相似的问题:我启用了“首选 32 位”;关闭它可以解决问题。
      【解决方案8】:

      我遇到了完全相同的问题。我无法删除依赖项,因为主项目需要它。第二个项目是控制台项目。

      我改成类库,然后一切正常。

      【讨论】:

      • 这条评论解决了我的问题。谢谢!
      【解决方案9】:

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

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

      【讨论】:

      • 这解决了我的问题。知道原因吗?
      【解决方案10】:

      另一种解决方法,以防无法更改带有错误应用程序清单的依赖 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");
              }
          }
      }
      

      【讨论】:

        【解决方案11】:

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

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

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

        【讨论】:

        • 你成功了,谢谢
        【解决方案12】:

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

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

        清单

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

        2. 导航到属性 -> 构建:确保 a 和 b 在同一目标平台上

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

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

        【讨论】:

        • #3 成功了
        【解决方案13】:

        还解决了 ClickOnce .exe 调用 .exe 调用 .exe。

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

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

        我不得不注释掉第二个和第三个应用程序的清单内容

        Walkthrough: Manually Deploying a ClickOnce Application

        完美运行。

        【讨论】:

          【解决方案14】:

          我使用mage.exe 来生成我的清单。将此添加到我的.csproj 解决了这个问题。你也可以试试-nowin32manifestcompiler flag;我没有测试过。我在 Visual Studio 2017 中看不到 stuartd 的“创建没有清单的应用程序”;我认为这就是它的作用。

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

          我的.csproj也有这个:

          <GenerateManifests>false</GenerateManifests>
          

          【讨论】:

          • 来自使用dotnet 工具难以部署 ClickOnce 的人提供的一些附加信息:这是出现此错误的(可能有很多)方法之一。您可以通过在 Visual Studio 中打开有问题的 .exe 文件并选择 Open With... 并选择 Resource Editor 来确定问题是否是 Win32 清单。如果它包含 RT_MANIFEST 资源,则 ClickOnce 将失败。要摆脱此资源,请将 &lt;NoWin32Manifest&gt;true&lt;/NoWin32Manifest&gt; 添加到 .csproj,如本答案中所述。
          【解决方案15】:

          我的 VS 2019 应用程序也遇到了同样的问题。

          我曾尝试在没有清单的情况下创建应用程序,但没有成功。

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

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

          希望这会有所帮助!

          【讨论】:

            【解决方案16】:

            问题似乎是由 vs 2019 中的 setup.exe 引起的。执行新部署时,该 exe 似乎不会更新其版本。我的解决方法是

            1. 删除部署文件夹中的所有内容。
            2. 在属性 => 发布 => 先决条件中取消选中“创建安装程序以安装必备组件”。
            3. 进行部署。
            4. 返回并重新启用“创建安装程序以安装必备组件”。 猜想这个过程会强制 vs 2019 更新 setup.exe 到正确的版本。

            还有项目 --> 属性 --> 应用程序选项卡 --> 资源 --> 清单 --> 下拉“创建没有清单的应用程序”将起作用,但如果有较新版本,应用程序将不会更新,所以我必须回到上面的解决方法。

            【讨论】:

              【解决方案17】:

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

              正如 Eduardo 指出的,将两个项目都标记为 ClickOnce,并启用完全信任应用程序可以解决问题。

              【讨论】:

                【解决方案18】:

                我遇到了一个我能够解决的不同问题,所以我想发布。我的问题是我在 TFS 之外运行了 3 个分支。我在我的一个分支中升级了 Telerik 控件,但没有在其他分支中升级。一旦我升级了所有 3 个分支中的 Telerik 控件并重新发布它就可以工作,这个错误就消失了。

                当时我正在运行 VS2015。

                【讨论】:

                  【解决方案19】:

                  这很有趣。我只是重新部署应用程序并解决了问题。可能是因为网络导致文件损坏。

                  【讨论】:

                    【解决方案20】:

                    在我的 Visual Studio 2017 版本中,版本 15.6.6(但它可能更早存在)我发现应用程序文件不在右键单击 Exe 项目和发布中,而是在项目属性发布选项卡下可以设置您希望将哪些应用程序文件放入安装中。

                    所以取出有问题的。如果安装此应用程序的计算机上已经安装了某些东西,那么无论如何都没有理由尝试重新安装它,除非您需要参考才能运行它。如果要安装 PC 上已有的内容,但安装到不同的文件夹,则可能无法正常工作。最好将其他应用程序或 dll 程序集使用到与之前安装相同的位置。

                    【讨论】:

                      【解决方案21】:

                      我遇到了同样的情况,所以每当您更新程序集时,在我的情况下,我是从 CR For .Net framework 4.0 降级到 Framework 2.0 ,我将所有引用的程序集替换为旧程序集,该项目运行良好,但为了发布

                      您必须清洁整个解决方案

                      然后全部重建,然后发布就可以解决问题了。

                      谢谢

                      【讨论】:

                        【解决方案22】:

                        在我的情况下,解决方案中的 2 个 exe 项目将 .NET 目标设置为 4.8 和 4.6.1。在我将两者都设置为 4.8 后,错误停止了。

                        【讨论】:

                        • 这个问题有 21 个 现有答案,其中包括一个获得最高票数、超过 一百票 的被接受的答案。你确定你的解决方案还没有给出吗?
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2019-10-30
                        • 2011-07-30
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-07-18
                        • 1970-01-01
                        相关资源
                        最近更新 更多