我的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的唯一方法是将构建操作设置为&#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抱怨并拒绝运行该应用程序。
所以我被困在一块岩石和一块坚硬的地方之间:
.manifest
文件引用了这些文件,因此ClickOnce软件包不会部署 - 它会抱怨&#34;缺少文件&#34; (例如BytescoutVideoMixerFilter.dll.deploy
)。如果我可以解决其中任何一个问题,我已经完成了,而且我再也没有接触过COM。但是,我已经尝试了一切:我无法在不破坏清单文件的情况下获取已发布包中的文件。
答案 0 :(得分:2)
我设法破解了一种解决方法。这太可怕了,但我:
.deploy
个扩展名.deploy
文件复制到父目录我将一个脚本拼凑在一起,将文件复制到正确的位置。这是一种痛苦,当然不是我不得不做的事情 - 但它确实有效!