WiX для установки EventSource

Я создал источник событий на основе этого примера. Мой источник событий выглядит так:

[EventSource(Name = "Samples-EventSourceDemos-EventLog")]
public sealed class MinimalEventSource : EventSource
{
    public static MinimalEventSource Log = new MinimalEventSource();

    [Event(1, Message = "{0} -> {1}", Channel = EventChannel.Admin)]
    public void Load(long baseAddress, string imageName)
    {
        WriteEvent(1, baseAddress, imageName);
    }
}

В примере используется код для имитации процесса установки / удаления. Из некоторых других вопросов SO я увидел еще один пример установки источника событий с использованием файла сообщений о событиях.

Но в нем отсутствуют некоторые хорошие примеры того, как установить / зарегистрировать EventSource, который определяется манифестами. Я исследую использование CustomAction, чтобы сделать что-то вроде:

wevtutil.exe im <EtwManifestManFile> /rf:"EtwManifestDllFile" /mf:"EtwManifestDllFile"

но интересно, есть ли у вас какие-либо предложения?

2 ответа

Решение

Разобрался после некоторого поиска. В WixUtilExtension есть встроенная поддержка. После ссылки на него и добавления пространства имен это довольно просто.

Вот изменения в Product.wxs:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
...
      <Component Id="etwManifest.dll">
        <File Id="etwManifest.dll" KeyPath="yes"
              Source="$(var.SampleClassLibrary.TargetDir)\SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll" />
      </Component>
      <Component Id="etwManifest.man">
        <File Id="etwManifest.man" KeyPath="yes"
              Source="$(var.SampleClassLibrary.TargetDir)\SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.man">
          <util:EventManifest  MessageFile="[etwManifest.dll]"  ResourceFile="[etwManifest.dll]"></util:EventManifest>
        </File>
      </Component>
</Wix>

Единственный трюк, который мне пришлось сделать, - это уменьшить длину идентификатора компонента и идентификатора файла (используется для сопоставления с именами файлов), чтобы избежать следующей ошибки: Ошибка 25540. Произошла ошибка при настройке файлов XML.

Для меня решение было добавить разрешение для обоих файлов,.dll и.man. ( /questions/36142221/preduprezhdenie-resursyi-provajdera-nedostupnyi-pri-zapuske-wevtutil/36142239#36142239)

<util:PermissionEx User="Everyone" ReadPermission="yes" ReadAttributes="yes" ReadExtendedAttributes="yes" />

Мне также пришлось добавить полный путь для правильной регистрации файла манифеста. Когда я этого не делал, файл манифеста все еще ссылался на папку bin/release моего решения Visual Studio.

<util:EventManifest MessageFile="[INSTALLFOLDER]SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll" ResourceFile="[INSTALLFOLDER]SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll"/>

Код:

<DirectoryRef Id="INSTALLFOLDER">
    <Component Id="etwManifest.dll" Guid="PUT-GUID-HERE">
        <File Id="etwManifest.dll" KeyPath="yes"  Source="$(var.SampleClassLibrary.TargetDir)\SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll" >
            <util:PermissionEx User="Everyone" ReadPermission="yes" ReadAttributes="yes" ReadExtendedAttributes="yes" />
             <util:PermissionEx User="Administrators"   ReadPermission="yes" ReadAttributes="yes" ReadExtendedAttributes="yes"/>
        </File>
    </Component>

    <Component Id="etwManifest.man" Guid="PUT-GUID-HERE">
        <File Id="etwManifest.man" KeyPath="yes" Source="$(var.SampleClassLibrary.TargetDir)\SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.man" >
            <util:PermissionEx User="Everyone"   ReadPermission="yes" ReadAttributes="yes" ReadExtendedAttributes="yes"/>
            <util:PermissionEx User="Administrators"   ReadPermission="yes" ReadAttributes="yes" ReadExtendedAttributes="yes"/>
            <util:EventManifest MessageFile="[INSTALLFOLDER]SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll" ResourceFile="[INSTALLFOLDER]SampleClassLibrary.Samples-EventSourceDemos-EventLog.etwManifest.dll"/>
        </File>
    </Component>
</DirectoryRef>

Использование WiX Toolset v3.10

(Пожалуйста, исправьте меня, если мой английский плох)

Другие вопросы по тегам