"Регистрация для COM-взаимодействия" и "Сделать сборку COM видимой"

Какова реальная разница между этими двумя параметрами? Я знаю:

Регистрация для COM-взаимодействия
Эти параметры выполняют регаму на сборке и регистрируют сборку как COM-компонент (или, может быть, нет) в реестре со всеми COM, как записи реестра. На этом этапе создается файл TLB? Что еще сделано?

Иногда я вижу, что tlb генерируется при компиляции проекта, но иногда нет, почему это так?

Сделать сборку COM видимой
Какое влияние это имеет на сборку? Если у меня есть следующий тип внутри этой сборки, мне еще нужно указать "Сделать сборку COM Visible", хотя мой тип отмечен как ComVisible?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)]
public interface IMyInterface
{
}

Ответ 1

"Сделать сборку COM видимым" - это большой молот, чтобы сделать все публичные типы сборки [ComVisible]. Крайне желательно, вам нужно будет выбрать конкретные типы, которые вы хотите видеть, например, в вашем фрагменте.

После сборки сборка должна быть зарегистрирована, чтобы COM-клиент мог ее найти. Который использует только число, чтобы идентифицировать объект, который он хочет создать, GUID, дополнительный поиск необходим, чтобы узнать, что DLL реализует. Регистрация включает в себя запись ключей в разделе HKLM\Software\Classes\CLSID\{guid} реестра. Вы можете сделать это самостоятельно, запустив Regasm.exe /codebase /tlb, или вы можете оставить его в системе сборки, чтобы сделать это автоматически после сборки сборки.

Что такое "Регистрация для COM-взаимодействия". Это желательно, поскольку он гарантирует, что старая копия DLL автоматически регистрируется до ее перезаписывания, что предотвращает загрязнение реестра. VS необходимо запустить с повышенным доступом, чтобы иметь доступ на запись к этим разделам реестра, что является одной из причин сделать его необязательным. Или вы просто не хотите регистрировать его, распространенный на серверах сборки. Я не могу прокомментировать, почему вы иногда не получаете .tlb без дополнительной диагностики.

Ответ 2

В дополнение к комментариям, сделанным в выбранном ответе,. Файл tlb не создается, если типы или методы изменились без предварительного удаления соответствующей записи из реестра Windows (или закрытия приложения или службы, использующей библиотеку) с использованием параметра /U утилиты RegAsm:

Regasm.exe yourlibrary.dll /codebase /tlb /u

Также важно отметить, что реестр для использования библиотеки как COM будет работать только на машине разработчика, если он скомпилирован с использованием опций Register для взаимодействия COM и Make Assembly COM-Visible. Необходимо зарегистрировать его вручную на каждом конечном компьютере, используя указанную командную строку или создав сценарий, который выполняется при установке библиотеки.

Приношу свои извинения за размещение комментариев в качестве ответа, но я не могу размещать комментарии в сообщении, поскольку запрашиваю 50 баллов репутации.