2016-10-18 4 views
0

Microsoft EventRegister Tool создает файл манифеста инструментария вместе с файлом ресурсов во время компиляции проекта. Я хотел бы переместить эти файлы на другой путь после компиляции и изменить два атрибута в файле манифеста инструментария с помощью msbuild. Значения атрибутов одинаковы, каждый из них представляет путь к файлу сопутствующих ресурсов. Кажется, я не могу получить синтаксис для изменения атрибутов с помощью права msbuild, и я полагаю, что это имеет какое-то отношение к двум вещам.Как изменить значение атрибута в манифесте инструментария с помощью msbuild?

Во-первых, файл манифеста инструментария не содержит классического объявления XML-файла. Во-вторых, манифест инструментария включает пространства имен.

То, что я придумал до сих пор, благодаря сообщению в блоге "Updating XML files with MSBuild" by Sayed Ibrahim Hashimi, это:

<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.

ответ

0

В расширении XML Util для Windows Installer элемент 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>