ClickOnce清单文件 - 复制"文件"正在生成的条目

时间:2016-01-04 16:34:00

标签: c# com clickonce manifest

我的ClickOnce应用程序中有各种fungames,尽管我已经解决了这些问题,但我已经陷入了最后的障碍。

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

enter image description here

和3个DLL,它们需要位于可执行目录中:

enter image description here

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的唯一方法是将构建操作设置为&#34; Content&#34;。但是,如果我执行此操作,已发布的清单会为添加的每个文件添加重复部分:例如,我将BytescoutVideoMixerFilter.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" />
  </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 Build Actions设置为Resource(或其他任何内容),则它们不会包含在已发布的包中。由于已发布的.manifest文件引用了这些文件,因此ClickOnce软件包不会部署 - 它会抱怨&#34;缺少文件&#34; (例如BytescoutVideoMixerFilter.dll.deploy)。
  • 如果我将DLL构建操作设置为内容,它们将包含在已发布的包中 - 但已发布的清单现在具有重复的条目。

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

1 个答案:

答案 0 :(得分:2)

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

  • 将项目中DLL的构建操作更改为&#34;无&#34;
  • 创建了一个名为&#34; Resources&#34;的文件夹。在项目中,并将DLL的单独副本放在那里。对这些的构建行动是&#34;内容&#34;。
  • 现在发布项目包括Resources文件夹中的.deploy个扩展名
  • 的DLL
  • 我将这些.deploy文件复制到父目录
  • 我现在可以通过ClickOnce下载/更新应用程序

我将一个脚本拼凑在一起,将文件复制到正确的位置。这是一种痛苦,当然不是我不得不做的事情 - 但它确实有效!