Получение Wix Votive для регистрации COM-объектов
Я использую Wix 3.5 Votive (Visual Studio Integration), чтобы создать установщик для некоторых объектов COM.
В Votive установка ссылки на проект извлекает двоичные файлы из этого проекта и автоматически генерирует источник Wix во время компиляции. Это абсолютно здорово, это СУХОЙ и означает, что мне не нужно постоянно обновлять Wix XML. Фрагмент, который генерирует Votive, выглядит так:
<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-регистрацию для выходной сборки этого проекта. Кто-нибудь достиг этого, и, если да, не могли бы вы помочь мне, пожалуйста, пока мой мозг не превратился в желе!
2 ответа
Я не верю, что что-либо из этого должно быть сделано, так как это отнимает от контроля изменений / детерминированного поведения, которое мне нравится видеть в моих установщиках. Я хочу знать, что каждый отдельный файл / ресурс в установке был явно помещен в установщик и что он не всплывает по волшебству. Я хочу явно собрать и написать мои метаданные COM, чтобы я знал, что это правильно. Когда вы выполняете "Извлечение COM при сборке" (терминология InstallShield), процесс может завершиться неудачей по ряду причин, и в результате вы получите, казалось бы, хорошую сборку с неправильной установкой, которая не будет развернута должным образом. Вы можете процитировать DRY prinicipal, но в этой области правила применяются немного по-другому.
Кажется, что в Wix 3.0 (по крайней мере) он не может генерировать элементы взаимодействия COM, если библиотека скомпилирована на сетевом диске. Я обнаружил такое же поведение при компиляции с.NET 2.0 или.NET 4.0. Возвращаясь к созданию локального диска (например, C:), эта проблема исчезает для сборок.NET 2.0 и.NET 4.0.
Я еще не нашел хорошего обходного пути, кроме как убедиться, что он находится на локальном диске.:(