Visual-Studio Manifest工具不接受多个附加清单文件?

时间:2016-05-20 12:17:32

标签: visual-studio visual-c++ msbuild manifest

TL; DR (如何)可以通过实际的Additional Manifest Files GUI / props选项让Visual Studio(2010-2015)接受多个清单文件(合并)(而不是通过解决方法)?

简化演练:

我的C ++应用程序embeds an additional manifest file(包含私有程序集信息)通过Visual-C ++设置:Cfg Properties > Manifest Tool > Input and Output > Additional Manifest Files

C++ Property Page of Visual Studio 2015 test project

正常工作

现在,我需要在第二个清单文件中添加/合并。由于该选项被称为" Additional Manifest File_s _",这是一个多行编辑框,我尝试添加要合并的第二个文件:

additional manifest files edit dialog

VS 2015告诉我:

1>LINK : fatal error LNK1104: cannot open file 'private-assem.manifest my-compat.manifest'
VS 2010告诉我:

2>private-assem.manifest my-compat.manifest : general error c1010070: Failed to load and parse the manifest. Das System kann die angegebene Datei nicht finden.

这里要注意的是,两个工具都将两个文件连接成一个,实际上,在查看命令行时,我们看到:(注意引号)

/manifest "private-assem.manifest my-compat.manifest" /verbose /out:"Debug\ConsoleApplication2.exe.embed.manifest" /nologo "Debug\ConsoleApplication2.exe.embed.manifest.res"

command line of mt.exe 并进一步研究我们看到的mt.exe帮助:

C:\Program Files (x86)\Microsoft Visual Studio 14.0>mt /?
Microsoft (R) Manifest Tool version 6.3.9600.17336
Copyright (c) Microsoft Corporation 2012.
All rights reserved.

Usage:
-----
mt
    [ -manifest <manifest1 name> <manifest2 name> ... ]
...

请注意,清单文件选项是空格分隔,因此VS传递给mt.exe的是humbug,因为它将两个文件都包含在一个引号字符串中。

问题

有没有办法让Additional Manifest Files选项真正适用于多个文件?或者我做错了什么?

背景/解决方法

我可以想到以下可能的解决方法:

  • 尝试通过预链接步骤和手动调用mt.exe来共同破解某些东西(未尝试过:可怕)
  • 实际上将清单文件作为文件项添加到VS项目中:这将起作用,但是:

    将多个.props属性表组合到一个项目中时出现了实际情况,其中一个项目是私有程序集,另一个项目是应用程序兼容性声明。因此,设置不会驻留在实际项目本身,而是驻留在项目中包含的属性表中。

我还在问题中包含标记,因为我

  1. 不确定应该责备什么 - VS或MSBuild
  2. 也许有可能攻击.props.vcxproj文件以使其工作

1 个答案:

答案 0 :(得分:0)

汉斯的评论出现在:

  

...空格不是文件分隔符。   在文件名之间加上分号。

在属性中的每个;文件名之后添加一个seimcolon .manifest可以解决问题。 VS / MSBuild(无论谁)将正确引用/manifest选项。

即,而不是指定:

  <ItemDefinitionGroup>
    <Manifest>
      <AdditionalManifestFiles>somefile.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
    </Manifest>
  </ItemDefinitionGroup>

所有属性表文件(实际上所有Additional Manifest Files设置)都可以(并且应该)在每个文件名后附加一个分号(当只选择一个文件时也会这样做,这样就可以为多个属性表正确组合):

  <AdditionalManifestFiles>somefile.manifest; %(AdditionalManifestFiles)</AdditionalManifestFiles>
                                           ^^^