Почему C# необходимо зарегистрировать COM DLL, чтобы ссылаться на него?

Для того, чтобы использовать COM .dll в C++ все, что мне нужно во время компиляции, это #import TLB (или DLL, которая извлекает TLB), и я готов к работе. Почему C# требует, чтобы DLL была зарегистрирована (рег-свободный COM такой же, как зарегистрирован) для компиляции? Почему TLB недостаточно?

Обратите внимание, что мой вопрос касается компиляции .dll используя объект COM. Я понимаю, почему объект должен быть зарегистрирован во время выполнения.

1 ответ

Решение

Во-первых, в отличие от компилятора C++ или многих других компиляторов, которые могут читать библиотеки типов, ни CLR, ни.NET-компиляторы фактически не читают библиотеку типов. Они оба зависят от библиотеки взаимодействия, сборки.NET, которая генерируется из библиотеки типов. Он содержит только объявления, декомпилированные из tlb, в формате, понятном как CLR, так и компиляторам.

Основным инструментом, который делает это, является Tlbimp.exe, импортер библиотеки типов.

Запуск Tlbimp.exe не является жестким требованием, хотя вы можете подумать об этом на сервере сборки. В среде IDE также поддерживается просмотр зарегистрированных библиотек типов из диалогового окна "Добавить ссылку". Элемент, который добавляется в проект, содержит раздел реестра, а не имя библиотеки типов. <ResolveComReference> Задача MSBuild создает сборку взаимодействия из информации реестра.

Основным преимуществом этого является то, что теперь легко генерировать записи манифеста, так что COM-сервер можно использовать без регистрации. Ака "reg-free COM". Информация о реестре необходима для предоставления записей манифеста. Включается просто путем установки свойства Isolated на True для справки. Очень желательно.

Другие вопросы по тегам