Зарегистрируйте .NET COM DLL во время установки Wix - PullRequest
11 голосов
/ 19 октября 2011

Фон:

Наше приложение является плагином для гораздо большего приложения. Все, что мы создаем, - это 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?

1 Ответ

10 голосов
/ 19 октября 2011

Я только что обнаружил, что heat.exe file myDll.dll -scom -o myDll.wxs выводит значения реестра, аналогичные тем, которые мне нужны.

Вы уверены, что там -scom?AFAIK, эта опция фактически подавляет регистрацию COM!

Теперь, как мне ссылаться на вновь созданный компонент внутри компонента DLL?

Компонент, сгенерированный heat.exe, уже включаетFile элемент для DLL.Таким образом, он фактически содержит все необходимое для установки и регистрации файла DLL.Вам не нужен оригинальный «компонент DLL».

Если вам нужно поместить файл и его COM-регистрацию в отдельные компоненты, то вам придется удалить элемент File из компонента, сгенерированного программой heat.exe.

Также, компонентыне может ссылаться на другие компоненты.Вы можете иметь ссылки между ComponentGroup s, хотя мы часто используем их в наших wixlibs для зависимостей модели , но это довольно сложный вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...