【发布时间】:2016-01-06 02:05:50
【问题描述】:
我的 ClickOnce 应用程序遇到过各种 fun 和 games,尽管我努力解决了这些问题,但我还是遇到了最后一道障碍。
我的 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。但是,我已经尝试了一切:如果不破坏清单文件,我就无法获取已发布包中包含的文件。
【问题讨论】: