2016-10-18 9 views
0

Microsoft EventRegister Toolは、プロジェクトのコンパイル中にインスツルメンテーションマニフェストファイルをリソースファイルとともに作成します。コンパイル後にこれらのファイルを別のパスに移動し、msbuildを使用してインストルメンテーションマニフェストファイルの2つの属性を変更したいとします。属性の値は同じで、それぞれが付随するリソースファイルのパスを表します。 msbuildで属性を変更するための構文を得ることができないようですが、それは2つのことと関係していると思います。msbuildを使用して計測器マニフェストの属性の値を変更する方法は?

まず、インストルメンテーションマニフェストファイルには、古典的なxmlファイル宣言が含まれていません。第2に、計装マニフェストは名前空間を含む。

私は今のところ出ている何を、ブログの記事"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

WindowsインストーラXML Util拡張では、要素マニフェストEventManifestを使用してイベントマニフェストをインストールします。このエレメントは、インストール中の設定ファイルの変更をスケジュールします。インストールログを有効にしてインストールを実行した後、ログを調べ、SchedXmlFileエントリを調べました。あなたは、次の表記を使用する場合、私はこのコードフラグメントを試みたが、あなたがたXPath名前空間を省略することができそうです

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

<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> 
あり、私は次のXPath式を見つけました
関連する問題