Настройте манифест инструментария событий «базового» проекта в соответствии с потребностями «производных» проектов - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над двумя разными C ++ DLL-проектами, которые делятся большей частью своего кода.Итак, у меня есть один базовый проект, который компилируется в Base.lib, и два «производных» проекта, которые компилируются в Derived1.dll и Derived2.dll и ссылаются на Base.lib.Эти производные DLL должны быть отправлены независимо.Пользователь даже не знает, что они связаны.

Теперь я хочу, чтобы обе мои библиотеки DLL были провайдерами событий Windows .Все события, которые я хочу зарегистрировать, происходят в Base.lib.Итак, я добавил Instrumentation.man к этому проекту и сделал его частью сборки.Его содержимое выглядит примерно так:

<?xml version="1.0" encoding="UTF-16"?>
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd" xmlns="http://schemas.microsoft.com/win/2004/08/events" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:trace="http://schemas.microsoft.com/win/2004/08/events/trace">
  <instrumentation>
    <events>
      <provider name="Company-Provider-Base" guid="{12345678-1234-1234-1234-1234567890ABCD}" symbol="provider" resourceFileName="some/path/to.dll" messageFileName="some/path/to.dll" message="$(string.provider.message)">
        <events>
            ...
        </events>
      </provider>
    </events>
  </instrumentation>
  <localization>
    <resources culture="en-US">
      <stringTable>  
        <string id="provider.message" value="Base Provider" />
        ...
      </stringTable>
    </resources>
  </localization>
</instrumentationManifest>

Я использую mc.exe, чтобы скомпилировать его в файл ресурсов и файл заголовка.Заголовочный файл включен в другие исходные файлы моего базового проекта.

Теперь это работает на удивление хорошо!Все события регистрируются правильно для обеих библиотек DLL.

Однако, конечно, обе библиотеки DLL теперь совместно используют одного и того же провайдера с тем же именем, guid и сообщением.

Итак,Мой настоящий вопрос таков: Как я могу сделать элемент provider в Instrumentation.man настраиваемым таким образом, чтобы мои DLL-проекты могли заполнять свои собственные атрибуты name, guid и message?

Я использую WiX для создания своих установочных комплектов.WiX позволяет мне настраивать атрибуты resourceFileName и messageFileName элемента provider (оба указывают на пустышки в исходном файле) только тогда, когда библиотеки DLL развернуты в целевой системе, чтобы на них можно было правильно ссылаться.Однако WIX не предлагает аналогичного способа (по крайней мере, я этого не вижу) для изменения других атрибутов столь же плавно, что было бы именно тем, что я хочу.

Я также заметил, что WiX предлагаетнастроить атрибут parameterFileName.К сожалению, я не могу найти никакой информации, как эти параметры работают.Я понимаю, что могу вставить %%n в строки манифеста, и тогда будет вставлен параметр с идентификатором n.Но я не понимаю, где и как объявлять эти параметры, а также не знаю, смогу ли я использовать их в атрибутах, которые я хочу настроить, чтобы они вообще мне не помогли.

1 Ответ

0 голосов
/ 07 декабря 2018

В итоге я написал свой собственный инструмент для модификации XML (в C #, как описано здесь , но подойдет и любой другой язык), который принимает файл манифеста и имя решения и соответственно заменяет значения атрибута.

Чтобы сделать это автоматически, я добавил событие Pre-Build Event в базовый проект, который вызывает этот инструмент и передает ему файл манифеста и $(SolutionName).

. Это решение не слишком красивое.не легко масштабируется, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...