Я использую Wix 3.5 Votive (интеграция с визуальной студией) для создания установщика для некоторых COM-объектов.
В Votive установка ссылки на проект извлекает двоичные файлы из этого проекта и автоматически генерирует исходный код Wix во время компиляции. Это абсолютно здорово, это СУХОЙ и означает, что мне не нужно постоянно обновлять Wix XML. Фрагмент, который генерирует Вотив, выглядит так:
<Fragment>
<DirectoryRef Id="INSTALLLOCATION">
<Component Id="cmpBCE83EAB1AAF2230E306A7325EE7EA11" Guid="*">
<File Id="fil61D40E7D1A1D0A60C27CE6960FED2B0B" Source="$(var.My.Assembly.TargetDir)\My.Assembly.dll" />
</Component>
</DirectoryRef>
</Fragment>
То же самое происходит с исходными файлами, документами и сателлитами, ни один из которых я не использую. Однако чего он не делает, так это создания объектов реестра для регистрации COM (сборка помечена как «COM Visible» и «Register for COM Interop», но у Votive, похоже, нет механизма, чтобы справиться с этим.
За кулисами Votive вызывает Heat.exe для сбора всего этого материала, а вызов Heat на сборке выплевывает файл с кучей записей <Class .../>
и <RegistryValue .../>
, что как раз и необходимо для регистрации COM. Итак, конечно, Heat может сгенерировать этот материал, и было бы просто сделать это один раз и отредактировать результат в проекте Wix. Но это нарушает принцип DRY и требует, чтобы проект Wix синхронизировался с исходным кодом вручную. По косвенным причинам я бы предпочел, чтобы Votive / MSBuild выполнял это автоматически при каждом построении решения.
Я ни в коем случае не являюсь экспертом по MSBuild, и мне очень нужно изучить Wix, Votive и MSBuild. На это у меня ушло несколько дней. Итак, у меня такой вопрос: есть ли простой способ заставить Votive / MSBuild генерировать этот регистрационный материал COM каждый раз, когда создается решение? Я ожидал, что для каждого проекта, на который имеется ссылка, если установлен параметр «Зарегистрировать для взаимодействия с COM», Votive / MSBuild сгенерирует регистрационный материал COM для выходной сборки этого проекта. Кто-нибудь достиг этого, и, если да, не могли бы вы протянуть мне руку помощи, прежде чем мой мозг превратится в желе!