c# - ClickOnce list 文件 - 正在生成重复的 "file"条目

标签 c# com clickonce manifest

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

我的 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" />

完整的 list 文件是 here .

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

我可以获得发布者包中包含的 DLL 的唯一方法是将构建操作设置为“内容”。但是,如果我这样做,已发布的 list 对于添加的每个文件都有一个重复部分:例如,我设置了 BytescoutVideoMixerFilter.dll的 Build Action to Content,上面的 list 片段变成:

  <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>

...所以一个文件分为两个部分;第一个是我 list 中的设置,另一个似乎是在没有 comClass 的情况下自动生成的线。当然,由于两者都引用相同的 DLL,Windows 会提示并拒绝运行该应用程序。

所以我进退两难:

  • 如果我将 DLL 构建操作设置为资源(或其他任何内容),它们将不会包含在已发布的包中。如已发表.manifest文件引用这些文件,ClickOnce 包将不会部署 - 它会提示“丢失文件”(例如 BytescoutVideoMixerFilter.dll.deploy)。
  • 如果我将 DLL 构建操作设置为内容,它们将包含在已发布的包中 - 但已发布的 list 现在有重复的条目。

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

最佳答案

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

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

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

关于c# - ClickOnce list 文件 - 正在生成重复的 "file"条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34595589/

相关文章:

c# - NHunspell 拼写检查器中的错误

c# - c#中的JSON解析item不是数组

c# - 使用递归在 C# 中计算阶乘

c# - 使用 SVG 文件作为 Windows 应用商店应用程序 (Metro) 的背景

php - 使用变体在 PHP 中构建字节数组?

windows - OCX 的入口点

c# - 从第一个 WPF 应用程序中启动第二个实例

VB.NET/COM 服务器代码方式比 Excel VBA 代码慢

.net - 是否可以自动化 ClickOnce 部署?

c# - 单击一次部署后的通知图标设置