Однажды молодой наивный инженер подумал, что было бы неплохо разделить некоторые функции его приложения на 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 напрямую! См. этот вопрос для получения дополнительной информации .