如何将多个清单文件嵌入/合并到C#应用程序中?

12
在Visual Studio中,你可以在C++项目中设置一个名为"Additional Manifest Files"的选项,以将一个额外的清单文件合并到默认的应用程序清单中。
我们使用这个选项与一个共享的"兼容性清单"一起使用,该清单仅包含受支持的操作系统版本列表。
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
      <application>
        <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> <!--app support for Windows Vista -->
        <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!--app support for Windows 7 -->
        <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!--app support for Windows 8 -->
        <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!--app support for Windows 8.1 -->
      </application> 
    </compatibility>
</assembly>

现在我们希望将共享的清单嵌入到现有的WinForms/WPF应用程序中,以便它与现有的应用程序清单文件合并。使用C#项目是否可能实现这一点?我们想避免在每个项目中定义操作系统列表。


你有没有找到这个问题的解决方案? - Martin Ba
@MartinBa 不,如果发生了我会在这里发布的。 - floele
2个回答

0

您可以通过定义自定义目标,在包含在 exe 中之前合并清单来将mt插入构建过程中。将以下目标添加到您的项目文件中,然后添加其他清单作为<AdditionalManifestToMerge项目。

目标:

<Target Name="GenerateComFreeManifestItems" Condition="'@(AdditionalManifestToMerge)' != ''">
  <PropertyGroup>
    <Win32ManifestPreMerge>$(Win32Manifest)</Win32ManifestPreMerge>
    <Win32Manifest>$(IntermediateOutputPath)app_merged.manifest</Win32Manifest>
    <MtPath Condition="'$(MtPath)' == ''">C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\mt.exe</MtPath>
  </PropertyGroup>
</Target>
<Target Name="GenerateComFreeManifest" BeforeTargets="CoreCompile" DependsOnTargets="GenerateComFreeManifestItems"
    Condition="'@(AdditionalManifestToMerge)' != ''"
    Inputs="@(AdditionalManifestToMerge);$(Win32ManifestPreMerge)"
    Outputs="$(Win32Manifest)">
  <Exec Command="&quot;$(MtPath)&quot; -manifest &quot;$(Win32ManifestPreMerge)&quot;@(AdditionalManifestToMerge -> ' &quot;%(Identity)&quot;') -out:&quot;$(Win32Manifest)&quot;" />
  <ItemGroup>
    <FileWrites Include="$(Win32Manifest)" />
  </ItemGroup>
</Target>

项目:

<ItemGroup>
  <AdditionalManifestToMerge Include="..\path\to.dll.manifest" />
</ItemGroup>

注意:这种方法有点脆弱,因为它取决于每台机器上 mt.exe 的位置保持一致。我相信有一种适当的方法可以找到它 - 但谷歌没有帮助我(请参见在使用Visual Studio 2012时,查找SignTool.exe路径或“Windows Kits”目录的方法以获取一些不好的选项)。

0
你可以使用后构建操作调用ManifestTool mt.exe(来自Windows SDK)来添加或更新清单: mt.exe -updateresource:“myapp.exe”;#1 -manifest“additional.manifest” 有关更多信息,请参见MT command line
请注意,在选择签署程序集时,您必须在此修改后重新签署它: sn.exe -R“myapp.exe”“mykey.snk”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接