Как зарегистрировать файл Win32 COM DLL в WiX 3?

Я нашел пример регистрации DLL, Регистрация сборки для COM-взаимодействия в файле MSI с помощью набора инструментов XML установщика Windows., и WiX жалуется на атрибут AssemblyRegisterComInterop.

Я удалил это и изменил атрибут «Assembly» на win32, и он говорит, что мне нужно указать атрибут AssemblyManifest, но что я должен туда поместить?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
36
0
33 785
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Самый простой способ (а Роб М будет разглагольствовать о том, что это за неправильный) - просто использовать SelfRegCost=1 в теге File для DLL.

Это неправильно, потому что мы должны явно контролировать регистрацию DLL, а не позволять ей просто запускать произвольный код через DllRegisterServer. Теоретически DLL не должна делать ничего, кроме внесения соответствующих записей в реестр при вызове DllRegisterServer. К сожалению, многие из них делают больше, поэтому самостоятельная регистрация может быть единственным способом заставить вашу установку работать.

Это также неверно, потому что это означает, что система установки Windows ничего не знает об этих ключах реестра, а также о том, что должно и чего не должно быть. Это означает, что ремонт не сработает, и, возможно, деинсталляция не очистит должным образом и т. д.

В противном случае вы можете сгенерировать соответствующий код WiX, указав heat.exe на свою DLL и интегрировав его вывод в текущий проект WiX. Вы получите множество тегов Class, ProgID, TypeLib и Registry. Возможно, вам придется вручную отредактировать этот вывод, чтобы он был скомпилирован.

Надеюсь, это поможет.

Так что в основном скопируйте / вставьте вывод heat.exe и измените соответствующие пути и т. д.?

Davy8 13.12.2008 00:52

Мне нравится помещать созданные wxs во фрагмент, на который ссылается основной wxs. Какие параметры вы передали для heat, которые не регистрировали dll.

CheGueVerra 13.12.2008 02:42

Обычно мне приходится переместить теги class и progid в тег файла и, возможно, отредактировать некоторые ключи реестра. В частности, если DLL является .NET DLL, вам необходимо предоставить уникальные идентификаторы для ключей реестра, которые ссылаются на mscoree.dll, иначе вы получите коллизии с автоматически сгенерированными.

Troy Howard 13.12.2008 03:24

Я обычно запускаю тепло следующим образом: heat file -gg -sfrag "C: \ path \ to \ file.dll" -o myfile.wxs ... затем включаю сгенерированный файл wxs в проект по обету, изменяю его и ссылаясь на корневой компонент из "основного" wxs для модуля msi / merge через componentref или componentgroupref.

Troy Howard 13.12.2008 03:26

В процессе сборки я автоматизировал ручное редактирование с помощью настраиваемых скриптов. Я предлагаю вам сделать то же самое... ;)

Troy Howard 13.12.2008 03:29

Я использовал тепло для генерации регистрации COM, но при удалении продукта у меня возникла проблема - она ​​удаляет регистрацию COM, несмотря на то, что другие продукты все еще используют эту DLL. В результате выходят из строя другие продукты.

Sasha 03.01.2013 18:46

Просто вопрос, если, это плохо (я сам проповедовал другим), тогда почему значение SelfRegCost=1 не изменено на «извлечь материал через heat.exe, а затем включить созданный фрагмент»? По сути, это почти этап предварительной обработки.

0xC0000022L 08.04.2016 19:15

Но команда heat иногда бывает ошибочной и даже не генерирует wxs для COM-компонента.

Ven 24.01.2018 11:53

Не только я буду разглагольствовать о зле SelfReg. MSI SDK дает вам список причин Семь, почему не использовать SelfReg.

Пример:

<Component Id = "Component" Guid = "*">
    <File Source = "ComServer.dll">
        <Class Id = "PUT-CLSID-HERE" Context = "InprocServer32" ThreadingModel = "apartment" Description = "Your server description">
            <ProgId Id = "Your.Server.1" Description = "Your ProgId description">
                <ProgId Id = "Your.Server" Description = "Your ProgId description" />
            </ProgId>
        </Class>

        <Class Id = "PUT-PROXY-CLSID-HERE" Context = "InprocServer32" ThreadingModel = "both" Description = "Your server Proxies, assuming you have them">
            <Interface Id = "PUT-INTERFACEID-HERE" Name = "IInterface1" />
            <Interface Id = "PUT-INTERFACEID-HERE" Name = "IInterface2" />
            <Interface Id = "PUT-INTERFACEID-HERE" Name = "IInterface3" />
            <Interface Id = "PUT-INTERFACEID-HERE" Name = "IInterface4" />
        </Class>
    </File>
</Component>

В конечном счете, ответ Троя верен.

Самостоятельная регистрация считается вредной (простите намек Дейкстры).
Stein Åsmul 06.05.2015 22:50

Вы можете попробовать использовать программу heat.exe, а затем сослаться на фрагмент в своем коде wix.

 heat.exe file <filename> -out <output wxs file>

Как в:

 heat.exe file my.dll -out my.wxs

добавить, как использовать фрагмент

Theodosius Von Richthofen 08.02.2019 21:07

Другие вопросы по теме