Как изменить значение атрибута в манифесте инструментария с помощью msbuild?
Microsoft EventRegister Tool создает файл манифеста инструментария вместе с файлом ресурсов во время компиляции проекта. Я хотел бы переместить эти файлы по другому пути после компиляции и изменить два атрибута в файле манифеста инструментария с помощью msbuild. Значения атрибутов одинаковы, каждый из них представляет путь к сопровождающему файлу ресурса. Кажется, я не могу получить синтаксис для изменения атрибутов с помощью msbuild, и я полагаю, что это связано с двумя вещами.
Во-первых, файл манифеста инструментария не содержит классического объявления XML-файла. Во-вторых, манифест инструментария включает в себя пространства имен.
Что я придумал до сих пор, благодаря сообщению в блоге "Обновление файлов XML с помощью MSBuild" Сайеда Ибрагима Хашими, так это:
<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><Namespace Prefix='x' Uri='http://schemas.microsoft.com/win/2004/08/events' /></Namespaces>
<XPath>//x:events/provider/@messageFileName</XPath>
</UpdateManifest>
<UpdateManifest Include="UpdateresourceFileName">
<NewValue>$(DestinationManifestAssembly)</NewValue>
<Namespaces><Namespace Prefix='x' Uri='http://schemas.microsoft.com/win/2004/08/events' /></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
,
1 ответ
В расширении XML Util установщика Windows элемент 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>