Получение Wix Votive для регистрации COM-объектов

Я использую 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 для выходной сборки этого проекта. Кто-нибудь достиг этого, и, если да, не могли бы вы протянуть мне руку помощи, прежде чем мой мозг превратится в желе!


person Tim Long    schedule 21.10.2010    source источник


Ответы (2)


Я не верю, что что-либо из этого следует делать, поскольку это лишает меня контроля над изменением / детерминированного поведения, которое мне нравится видеть в моих установщиках. Я хочу знать, что каждый файл / ресурс в установке был явно помещен в программу установки и не всплывает по волшебству. Я хочу явно собрать и создать свои метаданные COM, чтобы знать, что это правильно. Когда вы выполняете «Извлечение COM при сборке» (терминология InstallShield), процесс может завершиться ошибкой по любому количеству причин, и тогда вы получите, казалось бы, хорошую сборку с плохой установкой, которая не будет развернута должным образом. Вы можете процитировать принцип DRY, но в этой области правила применяются немного иначе.

person Christopher Painter    schedule 21.10.2010
comment
Я полностью понимаю вашу точку зрения, но мой подход продиктован требованиями клиентов. Ситуация, которая у меня есть, диктует, что я должен сделать процесс максимально простым и автоматическим. Мне нужно создать проект установки шаблона, который можно было бы легко воспроизвести во многих проектах и ​​использовать неопытные программисты-любители. Сказать им отредактировать регистрацию COM вручную закончится неудачей. Кривая обучения Wix огромна, и я не могу навязывать это своим клиентам. Итак, если оставить в стороне плюсы и минусы, вопрос стоит - если только кто-то не предложит лучшее решение. - person Tim Long; 22.10.2010
comment
У вас был бы шанс, если бы это был iPhone, но в Windows этого никогда не произойдет. Установка сложна из-за сложности базовой платформы и технологических стеков. Запустить мастер установки просто, написать его - нет. Большинство разработчиков ненавидят работать над установками, потому что это сложно и скучно. Если бы кто-то мог абстрагировать это с помощью простой кнопки, это уже было бы сделано. - person Christopher Painter; 23.10.2010
comment
Меня притащили с криками и ногами к тому же выводу. Поэтому я принимаю этот ответ. - person Tim Long; 10.11.2011

Похоже, что с Wix 3.0 (по крайней мере) он не может генерировать элементы взаимодействия COM, если библиотека скомпилирована на сетевом диске. Я обнаружил такое же поведение при компиляции с .NET 2.0 или .NET 4.0. Вернувшись к созданию локального диска (например, C :), эта проблема исчезнет для сборок .NET 2.0 и .NET 4.0.

Я еще не нашел хорошего обходного пути, кроме как убедиться, что он находится на локальном диске. :(

person Robert P    schedule 30.12.2010