【问题标题】:ClickOnce manifest file - duplicate "file" entries being generatedClickOnce 清单文件 - 生成重复的“文件”条目
【发布时间】:2016-01-06 02:05:50
【问题描述】:

我的 ClickOnce 应用程序遇到过各种 fungames,尽管我努力解决了这些问题,但我还是遇到了最后一道障碍。

我的 WPF (.Net 4.0) 应用程序需要在我的项目中包含一个 COM 组件和 3 个 DLL。 COM 组件是:

以及需要在可执行目录中的3个DLL:

COM 组件还需要一个自定义 .manifest 文件,我的项目将使用该文件:这是其中的一个示例部分,引用了其中一个 DLL:

  <file name="BytescoutVideoMixerFilter.dll" asmv2:size="203368" xmlns="urn:schemas-microsoft-com:asm.v1">
<hash xmlns="urn:schemas-microsoft-com:asm.v2">
  <dsig:Transforms>
    <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
  </dsig:Transforms>
  <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
  <dsig:DigestValue>JYpOccueoR7YDchdz+iCMPquHtg=</dsig:DigestValue>
</hash>
<comClass clsid="{4407F28D-97C2-41C5-A23F-2FAE465CE7BB}" threadingModel="Both" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" description="Bytescout Video Mixer Filter" />

完整的清单文件是here

现在应用程序在本地运行良好,无论是从 Visual Studio 还是运行 .exe。但是,我需要通过 ClickOnce 部署应用程序,包括这 3 个 DLL。

获取发布者包中包含的 DLL 的唯一方法是将构建操作设置为“内容”。但是,如果我这样做,发布的清单对于添加的每个文件都有一个重复部分:例如,我将BytescoutVideoMixerFilter.dll 的构建操作设置为 Content,上面的清单 sn-p 变为:

  <file name="BytescoutVideoMixerFilter.dll" asmv2:size="203368" xmlns="urn:schemas-microsoft-com:asm.v1">
    <hash xmlns="urn:schemas-microsoft-com:asm.v2">
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>JYpOccueoR7YDchdz+iCMPquHtg=</dsig:DigestValue>
    </hash>
    <comClass clsid="{4407F28D-97C2-41C5-A23F-2FAE465CE7BB}" threadingModel="Both" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" description="Bytescout Video Mixer Filter" />
  </file>
  <file name="BytescoutVideoMixerFilter.dll" size="203368">
    <hash>
      <dsig:Transforms>
        <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
      </dsig:Transforms>
      <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
      <dsig:DigestValue>JYpOccueoR7YDchdz+iCMPquHtg=</dsig:DigestValue>
    </hash>
  </file>

... 所以一个文件有两个部分;第一个是我的清单中的设置,另一个似乎是自动生成的,没有comClass 行。当然,由于两者都引用同一个 DLL,Windows 会抱怨并拒绝运行该应用程序。

所以我被困在一块石头和一个坚硬的地方:

  • 如果我将 DLL 构建操作设置为资源(或其他任何内容),它们不会包含在已发布的包中。由于已发布的 .manifest 文件引用了这些文件,因此不会部署 ClickOnce 包 - 它会抱怨“缺少文件”(例如 BytescoutVideoMixerFilter.dll.deploy)。
  • 如果我将 DLL 构建操作设置为内容,它们将包含在已发布的包中 - 但已发布的清单现在有重复的条目。

如果我能解决其中任何一个问题,我就完成了,我再也不会碰 COM。但是,我已经尝试了一切:如果不破坏清单文件,我就无法获取已发布包中包含的文件。

【问题讨论】:

    标签: c# com clickonce manifest


    【解决方案1】:

    我设法破解了一种解决方法。这太可怕了,但我:

    • 将项目中 DLL 的 Build Action 更改为“None”
    • 在项目中创建了一个名为“Resources”的文件夹,并将 DLL 的单独副本放入其中。对它们的构建操作是“内容”。
    • 现在发布项目会将这些 DLL 包含在 Resources 文件夹中,并带有 .deploy 扩展名
    • 我将那些.deploy 文件复制到父目录
    • 我现在可以通过 ClickOnce 下载/更新应用程序

    我已经编写了一个脚本来将文件复制到正确的位置。这很痛苦,当然不是我期望做的事情 - 但它有效!

    【讨论】:

      猜你喜欢
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2015-12-10
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2015-02-26
      相关资源
      最近更新 更多