Репликация регистрации Visual Studio COM с помощью установщика WiX - PullRequest
36 голосов
/ 13 февраля 2009

Однажды молодой наивный инженер подумал, что было бы неплохо разделить некоторые функции его приложения на COM-компонент, написанный на C #. Visual Studio имела все инструменты для этого, верно? .NET был практически создан для этого, верно? ХА! Он сказал, это будет легко. У меня будет достойное разделение компонентов, сохраняющее бизнес-логику в стороне от внешнего интерфейса, а с COM я смогу использовать его из любого места! Он весело установил флажок register for COM interop в свойствах проекта, выставил нужные ему классы и пошел дальше.

О, испытания сделали такой выбор. Молодой инженер, теперь более опытный, теперь не желал бы этого никому. Однако бремя было положено на его плечи, и бремя оставалось тяжелым. Он посмотрел, чтобы облегчить груз.

Вместе с WiX, инструментом для генерации файлов установщика Windows из XML. Это его заинтриговало - он мог довольно просто воспроизвести большую часть кода, необходимого для правильного установочного файла Windows, из нескольких файлов конфигурации. Его достопримечательности смотрели вверх.

С WiX 2.0 он мог довольно легко генерировать файлы, необходимые для регистрации C # COM-объекта. Это связано с использованием инструмента сала. Он сделал бы что-то вроде следующего:

tallow -c -nologo MyComExposedLibrary.dll > MyComExposedLibrary.wxs

, который затем будет исправлен (сначала это было сделано вручную, но в конце концов я записал шаги в небольшой инструментальный набор окончательного идентификатора ссылки на каталог, ID компонента, fileID, GUID и кодовой базы).

Затем установщик будет установлен, и будет радостное празднование, если приложение будет работать.

Что это не так.

В течение нескольких дней молодой инженер анализировал различия между своим ПК для разработки и ПК для тестовой установки. «Все ключи реестра одинаковы!» Он бы воскликнул. «Все для MyComExposedLibrary зарегистрировано, клянусь!»

Кроме того, это не было.

На рассвете третьего дня, после многих горных рос, он понял, что Visual Studio регистрирует еще один объект, которого не было у его установщика: файл MyComExposedLibrary.tlb.

Visual Studio, по-видимому, все время регистрирует этот файл, создает дополнительные подразделы в разделе реестра HKLM\Software\Classes\Interface и регистрирует библиотеку типов в HKLM\SOFTWARE\Classes\TypeLib.

Таллоу не помог, пожаловавшись на то, что .tlb - это не файл, который он вздрогнул. Ни бета-версия WiX 3.0 - у этого, казалось, было еще больше проблем, заставляющих вещи работать.

Я также попробовал Хита. Это сгенерированные элементы реестра и элементы класса. Я очистил вывод тепла, а затем пошел компилировать его, но получил другую ошибку: error LGHT0130 : The primary key <uuid here> is duplicated in table 'Registry'. Проблема, насколько я могу судить, в том, что uuid на самом деле не существует ни в одном из моих исходных файлов wxs. Если я изменяю порядок ссылок на компоненты в моем элементе feature, то другой компонент dll выдает эту ошибку. Поскольку мне не удалось получить версию проекта для WiX 3.0 для компиляции, я не смог подтвердить, дает ли высокая температура правильную выходную информацию.

Я удалил все из установщика, кроме одной сборки, которая вызвала эту ошибку, и попытался скомпилировать снова. Я получил ту же ошибку. Arrugh!

Итак, мои молодцы, энтузиасты Windows и пользователи WiX, возникает два вопроса:

  • Является ли typelib родным для WiX? Если да, то как?
  • Если нет, как правильно зарегистрировать библиотеку типов с помощью установщика Windows?

Кроме того, я думаю, как еще одна часть этого, как Visual Studio определяет, как зарегистрировать библиотеку типов? (Правка: в статье библиотеки MSDN о регистрации typelib есть имена необходимых ключей , но мне все еще нужно выяснить, как получить uuid. (Это из этого сообщения в блоге на typelib и регистрация COM Ларри Остерманом .)) Читая немного больше, мне может потребоваться зарегистрировать эти биты вручную, но я надеюсь, что нет ...

Я оценил вывод из regasm /regfile:MyDll.dll MyDll.dll. Похоже, это те же ключи, которые генерирует wix для dll. Другой режим Regasm, regasm /tlb:<filename> создает и регистрирует библиотеку типов для сборки, но,

/ regfile [: FileName] Создать reg-файл с указанным именем вместо регистрации типов. Этот вариант нельзя использовать с параметрами / u или / tlb

кажется, что ключ / regfile несовместим с ключом / tlb. Khaaaaaaaan!

Дальнейшее обновление: Похоже, на самом деле не нужно для включения файла .tlb. Согласно этому сообщению в элементе typelib wix , MSI может создать / зарегистрировать это как часть процесса установки. Все сводится к настройке документа WiX для его фактической установки с получением правильных атрибутов.

Позже я узнал, что вы можете получить правильные атрибуты, используя нагрев на .tlb напрямую! См. этот вопрос для получения дополнительной информации .

Ответы [ 4 ]

11 голосов
/ 13 февраля 2009

Вы должны использовать Heat (WIX 3.0), расположенный в каталоге bin используемой версии. Взгляните на этот пост blog , мы используем его здесь, чтобы зарегистрировать все наши COM-объекты, создав фрагмент wix ...

что-то вроде

heat file MyComExposedLibrary.dll -out MyComExposedLibrary.wxs

После прочтения вашей правки я создам базовую версию MSI с wix, которая устанавливает только com-объект, посмотрите, работает ли он ... тогда вы будете знать, какое поле битвы атаковать ...

5 голосов
/ 16 июня 2009

Я недавно столкнулся с этой проблемой, и самый простой обходной путь, который я смог найти, состоит в следующем:

  1. Выполнить: Regasm MyDLL.dll /tlb:MyDLL.tlb
  2. Выполнить: файл Heat MyDLL.dll -out MyDll-1.wxs
  3. Выполнить: файл Heat MyDll.tlb -out MyDll-2.wxs

MyDll-2.wxs содержит элемент <Typelib>, который вы хотите скопировать и вложить в элемент <File>, созданный в MyDll-1.wxs. Это даст вам полный элемент <Component>, который вы можете использовать в проекте установщика.

2 голосов
/ 13 февраля 2009

Для извлечения информации COM, Tallow будет использовать regasm.exe инструмент , включенный в .NET Framework. Вполне вероятно, что Visual Studio использует тот же инструмент для регистрации сборок, когда вы включаете "зарегистрироваться для взаимодействия COM".

Разница в том, что tallow будет использовать переключатель regasm / regfile для отправки информации в файл .reg вместо фактической регистрации сборки. К сожалению, файл .reg, созданный regasm.exe, не является полным. Он пропускает записи typelib, которые он записывает в реестр во время реальной регистрации. Это может быть ошибка в регазме.

Чтобы ваш установщик работал, у вас есть три варианта:

  1. Добавьте недостающие ключи реестра в вывод сала вручную. Сало вывод предназначен для редактирования вручную и сохранены вместе с вашим другие файлы WXS в любом случае. Вы, кажется, пытаться полностью автоматически генерировать рабочий файл WXS, но я считаю, что это было никогда не цель дизайна сала.

  2. Используйте пользовательское действие , чтобы вызвать regasm из вашего установщика. Это немного зло, потому что вы можете потерять некоторые из сильных транзакционных гарантий, предоставляемых механизмом установщика Windows. Я имею в виду откаты, вызванные сбоем на полпути во время установки здесь.

  3. Избегайте регистрации в целом используя COM без регистрации. Это потребует создания файлы манифеста для обоих приложение и библиотека COM.

1 голос
/ 27 мая 2016

Я знаю, что это старый вопрос, но другие могут найти это полезным ...

После борьбы с этим я обнаружил, что вы можете получить информацию о библиотеке типов, используя tlbexp.exe , а затем нагреть и файл dll, и файл tlb. Включите результаты обоих в ваш wix-проект, и вам будет хорошо.

tlbexp.exe dllFile.dll /out:dllFile.tlb
heat.exe dllFile.dll ...
heat.exe dllFile.tlb ...
...