0

Microsoft EventRegister 工具在项目编译期间创建检测清单文件以及资源文件。我想在编译后将这些文件移动到另一个路径,并使用 msbuild 更改检测清单文件中的两个属性。属性的值是一样的,每一个都代表所附资源文件的路径。似乎我无法正确使用 msbuild 修改属性的语法,我认为这与两件事有关。

首先,检测清单文件不包含经典的 xml 文件声明。其次,检测清单包括命名空间。

多亏了 Sayed Ibrahim Hashimi 的博文“使用 MSBuild 更新 XML 文件”,到目前为止我想出的是这样的:

<PropertyGroup>
    <SourceManifestAssembly>$(OutputPath)Name.etwManifest.dll</SourceManifestAssembly>
    <DestinationManifestAssembly>$(Programdata)\MyCompany\MyProduct\1.0.0.0\Name.etwManifest.dll</DestinationManifestAssembly>
    <SourceManifest>$(OutputPath)Name.etwManifest.man</SourceManifest>
    <DestinationManifest>$(Programdata)\MyCompany\MyProduct\1.0.0.0\Name.etwManifest.man</DestinationManifest>
</PropertyGroup>
<ItemGroup>
    <UpdateManifest Include="UpdatemessageFileName">
        <NewValue>$(DestinationManifestAssembly)</NewValue>
        <Namespaces>&lt;Namespace Prefix='x'  Uri='http://schemas.microsoft.com/win/2004/08/events' /&gt;</Namespaces>
        <XPath>//x:events/provider/@messageFileName</XPath>
    </UpdateManifest>
    <UpdateManifest Include="UpdateresourceFileName">
        <NewValue>$(DestinationManifestAssembly)</NewValue>
        <Namespaces>&lt;Namespace Prefix='x'  Uri='http://schemas.microsoft.com/win/2004/08/events' /&gt;</Namespaces>
        <XPath>//x:events/provider/@resourceFileName</XPath>
    </UpdateManifest>
</ItemGroup>
<Target Name="AfterBuild">
    <Copy SourceFiles="$(SourceManifestAssembly)" DestinationFiles="$(DestinationManifestAssembly)" />
    <Copy SourceFiles="$(SourceManifest)" DestinationFiles="$(DestinationManifest)" />
    <XmlPoke XmlInputPath="$(DestinationManifest)" Query="%(UpdateManifest.XPath)" Value="%(UpdateManifest.NewValue)" Namespaces="%(UpdateManifest.Namespaces)" />
</Target>

这会负责复制,但不会更改属性值。

仪表清单文件如下所示:

<instrumentationManifest xmlns="http://schemas.microsoft.com/win/2004/08/events">
<instrumentation xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events">
    <events xmlns="http://schemas.microsoft.com/win/2004/08/events">
        <provider name="MyCompany-MyProduct-MyLog" guid="{658FE45E-C2D4-4E73-82BB-6441A0348D9B}" resourceFileName="C:\Documents\Visual Studio\Projects\Name\bin\Debug\Name.etwManifest.dll" messageFileName="C:\Documents\Visual Studio\Projects\Name\bin\Debug\Name.etwManifest.dll" symbol="MyCompanyMyProductMyLog">
        </provider>
    </events>
</instrumentation>

需要更改的属性是//provider/@resourceFileName//provider/@messageFileName

4

1 回答 1

0

在 Windows Installer XML Util 扩展中,元素EventManifest用于安装事件清单。该元素在安装过程中安排配置文件更改,这与上面描述的完全一样。在启用安装日志的情况下运行安装后,我只是查看了日志并检查了 SchedXmlFile 条目。在那里我找到了以下 XPath 表达式:

/*/*/*/*[@messageFileName]

我尝试了这个代码片段,当您使用以下符号时,您似乎可以省略 XPath 命名空间:

<PropertyGroup>
    <SourceManifestAssembly>$(OutputPath)Name.etwManifest.dll</SourceManifestAssembly>
    <DestinationManifestAssembly>$(Programdata)\MyCompany\MyProduct\1.0.0.0\Name.etwManifest.dll</DestinationManifestAssembly>
    <SourceManifest>$(OutputPath)Name.etwManifest.man</SourceManifest>
    <DestinationManifest>$(Programdata)\MyCompany\MyProduct\1.0.0.0\Name.etwManifest.man</DestinationManifest>
</PropertyGroup>
<ItemGroup>
    <UpdateManifest Include="UpdatemessageFileName">
        <NewValue>$(DestinationManifestAssembly)</NewValue>
        <XPath>/*/*/*/*/@messageFileName</XPath>
    </UpdateManifest>
    <UpdateManifest Include="UpdateresourceFileName">
        <NewValue>$(DestinationManifestAssembly)</NewValue>
        <XPath>/*/*/*/*/@resourceFileName</XPath>
    </UpdateManifest>
</ItemGroup>
<Target Name="AfterBuild">
    <Copy SourceFiles="$(SourceManifestAssembly)" DestinationFiles="$(DestinationManifestAssembly)" />
    <Copy SourceFiles="$(SourceManifest)" DestinationFiles="$(DestinationManifest)" />
    <XmlPoke XmlInputPath="$(DestinationManifest)" Query="%(UpdateManifest.XPath)" Value="%(UpdateManifest.NewValue)" />
</Target>
于 2016-10-20T09:53:27.150 回答