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 抱怨并拒绝 运行 该应用程序。
所以我进退两难:
- 如果我将 DLL 生成操作设置为资源(或其他任何内容),它们将不会包含在已发布的包中。由于发布的
.manifest
文件引用了这些文件,ClickOnce 包将不会部署 - 它会抱怨 "missing files"(例如 BytescoutVideoMixerFilter.dll.deploy
)。
- 如果我将 DLL 生成操作设置为内容,它们将包含在已发布的包中 - 但已发布的清单现在有重复的条目。
如果我能解决其中任何一个问题,我就完成了,而且我再也不会接触 COM。但是,我已经尝试了所有方法:我无法在不破坏清单文件的情况下获取已发布包中包含的文件。
我设法破解了 sort-of 解决方法。这太可怕了,但我:
- 将项目中 DLL 的生成操作更改为 "None"
- 在项目中创建了一个名为 "Resources" 的文件夹,并将 DLL 的单独副本放在那里。这些构建操作是 "Content".
- 发布项目现在包括 Resources 文件夹中的那些 DLL,具有
.deploy
个扩展名
- 我将那些
.deploy
个文件复制到父目录
- 我现在可以 download/update 通过 ClickOnce 应用程序
我编写了一个脚本来将文件复制到正确的位置。这很痛苦,当然不是我必须要做的事情 - 但它有效!
我的 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 抱怨并拒绝 运行 该应用程序。
所以我进退两难:
- 如果我将 DLL 生成操作设置为资源(或其他任何内容),它们将不会包含在已发布的包中。由于发布的
.manifest
文件引用了这些文件,ClickOnce 包将不会部署 - 它会抱怨 "missing files"(例如BytescoutVideoMixerFilter.dll.deploy
)。 - 如果我将 DLL 生成操作设置为内容,它们将包含在已发布的包中 - 但已发布的清单现在有重复的条目。
如果我能解决其中任何一个问题,我就完成了,而且我再也不会接触 COM。但是,我已经尝试了所有方法:我无法在不破坏清单文件的情况下获取已发布包中包含的文件。
我设法破解了 sort-of 解决方法。这太可怕了,但我:
- 将项目中 DLL 的生成操作更改为 "None"
- 在项目中创建了一个名为 "Resources" 的文件夹,并将 DLL 的单独副本放在那里。这些构建操作是 "Content".
- 发布项目现在包括 Resources 文件夹中的那些 DLL,具有
.deploy
个扩展名 - 我将那些
.deploy
个文件复制到父目录 - 我现在可以 download/update 通过 ClickOnce 应用程序
我编写了一个脚本来将文件复制到正确的位置。这很痛苦,当然不是我必须要做的事情 - 但它有效!