Wix, чтобы установить источник события
Я создал свой источник событий на основе этого примера. Мой источник событий выглядит следующим образом:
[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 я увидел другой пример установки источника событий с помощью файла сообщения о событии.
Но в нем отсутствуют некоторые хорошие примеры, как установить / зарегистрировать источник событий, который определен манифестами. Я исследую использование CustomAction, чтобы сделать что-то вроде:
wevtutil.exe im <EtwManifestManFile> /rf:"EtwManifestDllFile" /mf:"EtwManifestDllFile"
Но интересно, есть ли у вас какие-либо предложения?
2 ответа:
Выяснил после некоторого поиска. В WixUtilExtension есть встроенная поддержка. После ссылки на него и добавления пространства имен, это довольно легко.
Вот изменения в продукте.wxs:
Единственный трюк, который я должен был сделать, это уменьшить длину идентификатора компонента и идентификатора файла (используется для сопоставления с именами файлов), чтобы избежать следующей ошибки: Ошибка 25540. Произошла ошибка при настройке XML-файлов.<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>
Для меня решение состояло в том, чтобы добавить разрешение на оба файла .dll и тому подобное .мужчина. (https://stackoverflow.com/a/32727624/5500092 )
<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 v3. 10
(пожалуйста, поправьте меня, если мой английский плохой)