.net .manifest文件中正在生成重复的行

.net .manifest文件中正在生成重复的行,.net,visual-studio,manifest,.net,Visual Studio,Manifest,摘要: 我的项目使用的COM组件需要自我注册。该项目有自己的自定义myapp.exe.manifest文件,其中包括两行: <comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000

摘要: 我的项目使用的COM组件需要自我注册。该项目有自己的自定义
myapp.exe.manifest
文件,其中包括两行:

<comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />
换句话说,缺少属性值的重复行,在应用程序启动时自然会抛出错误

如果我从原始清单中删除其中一个“源”行,则生成的清单中的伪重复行和正确行都会消失,即注释掉
ICapturer
行,并且该行及其副本都不会生成

引用的组件的“嵌入互操作”和“隔离”都设置为false(请参见下面的屏幕截图)

鉴于VisualStudio总是希望生成清单(即使我已经要求它专门使用我的文件),如何停止生成重复的行

原始问题文本:

从我开始,我很难在ClickOnce应用程序中部署COM组件。我现在已经解决了这个问题,但它涉及到编辑生成的
.manifest
文件以包含一些被忽略的参数

我已经将自定义清单文件放入我的项目中,但每次构建它时,它都会重新生成一个几乎相同但不完全相同的清单。我有重复的部分:例如,在我的
应用程序清单中,我有:

<comInterfaceExternalProxyStub name="ICapturer" iid="{DCAFCA37-546E-4D0A-9C02-D3221E65FCA9}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />
。。。因此,重复的部分缺少“name”属性

理想情况下,我只想使用已知的良好清单文件,因此我创建了该文件并将其添加到我的项目中:

然而,即使在告诉VisualStudio不要生成清单文件,并在我的项目中基于该特定清单文件创建一个新的清单文件之后,它仍然坚持对其进行修改

如果VisualStudio不向其添加内容并破坏它,我如何生成一个完全符合我要求的清单文件

编辑:我已检查,引用的DLL上的隔离标志为False:

EDIT2:有趣的是,如果我注释掉项目清单文件中的
comInterfaceExternalProxyStub
部分,则生成的文件中会省略这两行。我的清单中的这些行似乎在某种程度上在生成的文件中生成了两行——它们几乎相同,但缺少“Name”属性。因此,为了说明:在
app.manifest
中有这一行:

 <comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />

在实际生成中生成以下两行:

<comInterfaceExternalProxyStub name="" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" />
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />


如果我注释掉
app.manifest
中的
comInterfaceExternalProxyStub
行,则生成的清单中不会出现任何一行。

如果您对该解决方案满意,您应该能够阻止Visual Studio自动生成清单文件:

但是,可以使用项目的生成清单属性禁用项目清单的生成。当此属性设置为“是”时,将生成此项目的清单。否则,链接器在解析应用程序代码的依赖项时会忽略程序集信息,并且不会生成清单


如果这不起作用(正如你所建议的),你可以尝试更改你的标签。将生成的“空”标记与您的标记进行比较,发现您的标记缺少
numMethods
属性。我看到了。问题中不清楚的是,当Click Once发布者重写您的清单并添加Click Once特定的goo时,这会出错

我尝试了一段时间,有不止一种方法可以做到这一点。例如,您可以将组件清单分开,并在主清单中使用
。没什么区别。单击一次清单中的
元素的属性非常奇怪,请注意它如何将
comInterfaceExternalProxyStub
声明为
文件的子级。将其移动以匹配模式不起作用,会导致元素完全消失。这份文件完全错了,这是麻烦的前兆

长话短说,这是一个错误。这不是一个奇怪的bug,应用程序清单文档非常糟糕,尤其是对于comInterfaceExternalProxyStub。有几次我用张俊峰的名字,这是一个句子,我不能在这里重复

您可以在connect.microsoft.com上报告。奇怪的是,以前没有关于这方面的报告,但大多数程序员不是不需要它,就是没有尝试或很快放弃,而是要求用户安装COM组件作为先决条件。这是很正常的,也许你也应该采取这种方法。除此之外,手动编辑清单并删除额外的行是一种解决方法


不要忘记尝试最明显的解决方法,comInterfaceExternalProxyStub通常不需要,并且在使用程序集引用中的
Isolated
属性时不会生成。绝大多数程序员的工作方式以及我之前给你的建议。只要您不使用工作线程中的COM组件,那么就不需要代理。

除非您为Microsoft工作,否则VS生成清单的方式就无能为力。注册表中绊倒它的垃圾,也许可以用Regedit.exe查看一下。HKLM\Sofware\Wow6432Node\Classes\Interface\{iid}键。你自己做清单就行了。项目>添加新项>应用程序清单文件。不要弄乱它的内容,将regfree条目合并到其中。我已经创建了自己的清单,并要求VS使用它,但它正在向文件中添加额外的行和整个部分,并破坏它。如果我在bin\debug中的清单上复制我的“好”清单,它就可以正常工作。@HansPassant:不,Isolated是假的-请参见上面的屏幕截图,这很奇怪。你确定这不是另一个程序或第三方吗
 <comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />
<comInterfaceExternalProxyStub name="" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" numMethods="" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="" xmlns="urn:schemas-microsoft-com:asm.v1" />
<comInterfaceExternalProxyStub name="IVideoWMVSettings" iid="{1A814EC2-55A9-4FA2-99E2-2C20A897C2E7}" proxyStubClsid32="{00020424-0000-0000-C000-000000000046}" baseInterface="{00000000-0000-0000-C000-000000000046}" tlbid="{8EDAD3BB-AE5F-43B4-A2F1-B04F4130F2E0}" xmlns="urn:schemas-microsoft-com:asm.v1" />