Фон:
Наше приложение является плагином для гораздо большего приложения. Все, что мы создаем, - это DLL-файлы, к которым подключается более крупное приложение. Из-за этого наши .NET (C #) файлы DLL должны быть зарегистрированы для интерфейса COM.
У нас есть работающий InstallShield проект, но по многим причинам, на которые я не буду здесь останавливаться, мы хотим перенести его в WiX . Единственное, что осталось сделать установщику, - это зарегистрировать наши DLL-файлы для COM.
Проблемы
Вот пример компонента с одним файлом DLL.
<Component Id="MyComponent" Guid="COMPONENT-GUID" SharedDllRefCount="yes" >
<File Id="MyDLL.dll" Name="MyDLL.dll" KeyPath="yes" Assembly=".net"
AssemblyManifest="MyDLL.dll" AssemblyApplication="MyDLL.dll" />
</Component>
Согласно принятому ответу Как зарегистрировать файл Win32 COM DLL в WiX 3? , рекомендуется добавить SelfRegCost=1
в тег File. Это приводит к ошибке во время установки:
Модуль C: \ Program files \ Product \ MyDll.dll не удалось зарегистрировать. HRESULT -2147024769. Обратитесь в службу поддержки.
Второй ответ на этот же вопрос (от Роба Меншинга) рекомендует не использовать такой подход, но добавить в тег файла следующее:
<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>
Я немного запутался, указав идентификаторы CLSID. Я вставил сгенерированный GUID и установил его. Он установлен нормально, но более крупное приложение не может найти файлы DLL. (Я использовал теги интерфейса, сгенерированные из heat.exe
.)
Другой подход, найденный в том же вопросе (Адан Теген), рекомендует использовать
Файл heat.exe myDll.dll -out my.wxs
Используя вывод, я добавляю это в тег File:
<TypeLib Id="Another Guid" Language="0" MagorVersion="1">
<!--Interfaces generated from heat.exe-->
</TypeLib>
Каждый способ, которым я пытался зарегистрироваться .NET для COM, не удался, и после прочтения такого количества вопросов по этой теме я не приблизился к тому, чтобы узнать правильный способ сделать это. Что я должен делать? Почему это такая трудная задача, когда все остальное в WiX было довольно простым?
Следует отметить, что оригинальный проект InstallShield создал пользовательское действие, которое вызывало бы regasm.exe
. Если ничего не получится, это может быть возможно, но я бы предпочел сделать все правильно.
Я только что обнаружил, что heat.exe file myDll.dll -scom -o myDll.wxs
выводит значения реестра, аналогичные тем, которые мне нужны. Теперь, как я могу ссылаться на недавно созданный компонент внутри компонента DLL?