Visual-Studio 清单工具不接受多个附加清单文件?
Visual-Studio Manifest Tool doesn't accept multiple Additional Manifest Files?
TL;DR(如何)是否有可能通过实际 Additional Manifest Files
GUI / 道具选项(而不是通过解决方法)?
简化的演练:
我的 C++ 应用程序 embeds an additional manifest file(包含私有程序集信息)通过 Visual-C++ 设置:Cfg Properties > Manifest Tool > Input and Output > Additional Manifest Files
按预期工作。
现在,我需要在第二个清单文件add/merge中。由于该选项称为 "Additional Manifest File_s_",并且这是一个多行编辑框,因此我尝试在此处添加第二个要合并的文件:
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"
进一步查看 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> ... ]
...
请注意,清单文件选项是 space 分隔的 因此 VS 传递给 mt.exe 的内容是骗局,因为它将两个文件包含在一个文件中引用字符串。
问题
有什么方法可以使 Additional Manifest Files
选项真正适用于多个文件吗?还是我做错了什么?
背景/解决方法
我可以想到以下可能的解决方法:
- 尝试通过 link 之前的步骤和手动调用 mt.exe 来破解某些东西(未尝试:太糟糕了)
实际将清单文件作为文件项添加到 VS 项目中:这可行,但是:
实际情况是将多个 .props
属性 工作表合并到一个项目中,其中一个指定私有程序集,另一个指定应用程序兼容性声明。因此,设置并不驻留在实际项目本身,而是驻留在项目中包含的 属性 工作表上。
我也在问题中加入了 msbuild 标签,因为我是
- 不确定这应该归咎于什么 - VS 或 MSBuild
- 也许有可能破解
.props
或 .vcxproj
文件来完成这项工作
汉斯的评论恰到好处:
... a space is not a file separator.
Put semicolons between the file names.
在属性中的每个 .manifest
文件名后添加一个分号 ;
就可以了。 VS / MSBuild(无论谁)将正确引用 /manifest
选项。
也就是说,而不是指定:
<ItemDefinitionGroup>
<Manifest>
<AdditionalManifestFiles>somefile.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
</ItemDefinitionGroup>
所有 属性 sheet 文件(实际上是所有 Additional Manifest Files
设置)可以(并且应该)在每个文件名后附加一个分号(当只指定一个时也这样做,所以它将正确组合多个 属性 sheets):
<AdditionalManifestFiles>somefile.manifest; %(AdditionalManifestFiles)</AdditionalManifestFiles>
^^^
TL;DR(如何)是否有可能通过实际 Additional Manifest Files
GUI / 道具选项(而不是通过解决方法)?
简化的演练:
我的 C++ 应用程序 embeds an additional manifest file(包含私有程序集信息)通过 Visual-C++ 设置:Cfg Properties > Manifest Tool > Input and Output > Additional Manifest Files
按预期工作。
现在,我需要在第二个清单文件add/merge中。由于该选项称为 "Additional Manifest File_s_",并且这是一个多行编辑框,因此我尝试在此处添加第二个要合并的文件:
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"
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> ... ]
...
请注意,清单文件选项是 space 分隔的 因此 VS 传递给 mt.exe 的内容是骗局,因为它将两个文件包含在一个文件中引用字符串。
问题
有什么方法可以使 Additional Manifest Files
选项真正适用于多个文件吗?还是我做错了什么?
背景/解决方法
我可以想到以下可能的解决方法:
- 尝试通过 link 之前的步骤和手动调用 mt.exe 来破解某些东西(未尝试:太糟糕了)
实际将清单文件作为文件项添加到 VS 项目中:这可行,但是:
实际情况是将多个
.props
属性 工作表合并到一个项目中,其中一个指定私有程序集,另一个指定应用程序兼容性声明。因此,设置并不驻留在实际项目本身,而是驻留在项目中包含的 属性 工作表上。
我也在问题中加入了 msbuild 标签,因为我是
- 不确定这应该归咎于什么 - VS 或 MSBuild
- 也许有可能破解
.props
或.vcxproj
文件来完成这项工作
汉斯的评论恰到好处:
... a space is not a file separator. Put semicolons between the file names.
在属性中的每个 .manifest
文件名后添加一个分号 ;
就可以了。 VS / MSBuild(无论谁)将正确引用 /manifest
选项。
也就是说,而不是指定:
<ItemDefinitionGroup>
<Manifest>
<AdditionalManifestFiles>somefile.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
</ItemDefinitionGroup>
所有 属性 sheet 文件(实际上是所有 Additional Manifest Files
设置)可以(并且应该)在每个文件名后附加一个分号(当只指定一个时也这样做,所以它将正确组合多个 属性 sheets):
<AdditionalManifestFiles>somefile.manifest; %(AdditionalManifestFiles)</AdditionalManifestFiles>
^^^