ClickOnce 清单文件 - 正在生成重复的 "file" 个条目

ClickOnce manifest file - duplicate "file" entries being generated

我的 ClickOnce 应用程序遇到了各种 fun and ,尽管我已经解决了这些问题,但我还是遇到了最后的障碍。

我的 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 的唯一方法是将构建操作设置为 "Content"。但是,如果我这样做,已发布的清单对于添加的每个文件都有一个重复部分:例如,我将 BytescoutVideoMixerFilter.dll 的构建操作设置为 Content,以及以上清单片段变为:

  <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 抱怨并拒绝 运行 该应用程序。

所以我进退两难:

如果我能解决其中任何一个问题,我就完成了,而且我再也不会接触 COM。但是,我已经尝试了所有方法:我无法在不破坏清单文件的情况下获取已发布包中包含的文件。

我设法破解了 sort-of 解决方法。这太可怕了,但我:

  • 将项目中 DLL 的生成操作更改为 "None"
  • 在项目中创建了一个名为 "Resources" 的文件夹,并将 DLL 的单独副本放在那里。这些构建操作是 "Content".
  • 发布项目现在包括 Resources 文件夹中的那些 DLL,具有 .deploy 个扩展名
  • 我将那些 .deploy 个文件复制到父目录
  • 我现在可以 download/update 通过 ClickOnce 应用程序

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