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





Самый простой способ (а Роб М будет разглагольствовать о том, что это за неправильный) - просто использовать SelfRegCost=1 в теге File для DLL.
Это неправильно, потому что мы должны явно контролировать регистрацию DLL, а не позволять ей просто запускать произвольный код через DllRegisterServer. Теоретически DLL не должна делать ничего, кроме внесения соответствующих записей в реестр при вызове DllRegisterServer. К сожалению, многие из них делают больше, поэтому самостоятельная регистрация может быть единственным способом заставить вашу установку работать.
Это также неверно, потому что это означает, что система установки Windows ничего не знает об этих ключах реестра, а также о том, что должно и чего не должно быть. Это означает, что ремонт не сработает, и, возможно, деинсталляция не очистит должным образом и т. д.
В противном случае вы можете сгенерировать соответствующий код WiX, указав heat.exe на свою DLL и интегрировав его вывод в текущий проект WiX. Вы получите множество тегов Class, ProgID, TypeLib и Registry. Возможно, вам придется вручную отредактировать этот вывод, чтобы он был скомпилирован.
Надеюсь, это поможет.
Мне нравится помещать созданные wxs во фрагмент, на который ссылается основной wxs. Какие параметры вы передали для heat, которые не регистрировали dll.
Обычно мне приходится переместить теги class и progid в тег файла и, возможно, отредактировать некоторые ключи реестра. В частности, если DLL является .NET DLL, вам необходимо предоставить уникальные идентификаторы для ключей реестра, которые ссылаются на mscoree.dll, иначе вы получите коллизии с автоматически сгенерированными.
Я обычно запускаю тепло следующим образом: heat file -gg -sfrag "C: \ path \ to \ file.dll" -o myfile.wxs ... затем включаю сгенерированный файл wxs в проект по обету, изменяю его и ссылаясь на корневой компонент из "основного" wxs для модуля msi / merge через componentref или componentgroupref.
В процессе сборки я автоматизировал ручное редактирование с помощью настраиваемых скриптов. Я предлагаю вам сделать то же самое... ;)
Я использовал тепло для генерации регистрации COM, но при удалении продукта у меня возникла проблема - она удаляет регистрацию COM, несмотря на то, что другие продукты все еще используют эту DLL. В результате выходят из строя другие продукты.
Просто вопрос, если, это плохо (я сам проповедовал другим), тогда почему значение SelfRegCost=1 не изменено на «извлечь материал через heat.exe, а затем включить созданный фрагмент»? По сути, это почти этап предварительной обработки.
Но команда heat иногда бывает ошибочной и даже не генерирует wxs для COM-компонента.
Не только я буду разглагольствовать о зле 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>
В конечном счете, ответ Троя верен.
Вы можете попробовать использовать программу heat.exe, а затем сослаться на фрагмент в своем коде wix.
heat.exe file <filename> -out <output wxs file>
Как в:
heat.exe file my.dll -out my.wxs
добавить, как использовать фрагмент
Так что в основном скопируйте / вставьте вывод heat.exe и измените соответствующие пути и т. д.?