Подтвердить что ты не робот

Всегда ли используются файлы .tlb во время выполнения?

Я работаю над продуктом, предоставляющим некоторый .NET API через COM-взаимодействие. В рамках сборки мы генерируем файлы *.tlb для всех таких сборок и доставляем их как часть отдельного пакета SDK. Наши клиенты могут установить SDK поверх нашего продукта и создавать приложения, которые используют наш COM API.

Нужно ли нам отправлять и регистрировать эти *.tlb файлы с самим продуктом? Есть ли ситуация, когда *.tlb требуются во время выполнения, когда закодированы сторонние библиотеки, закодированные против них?

Пожалуйста, объясните, как это работает, если вы ответите "Да". Я видел много комментариев по всему Интернету, которые говорят, что я должен их доставить и зарегистрировать, но я не нашел того, что четко объясняет, почему это должно быть сделано. Это заставило меня сомневаться, что это правда.

4b9b3361

Ответ 1

Да, это возможно. Особенно в случае .NET, вы не должны пропускать регистрацию библиотеки типов, потому что не можете предсказать, как клиентский код будет использовать ваш сервер.

Они не особенно распространены, но есть два случая:

  • Когда код клиента вызывает ваш метод [ComVisible], а вызов пересекает границу квартиры. Квартиры представляют собой концепцию COM, которая немного нечеткая, вам нужно понять разницу между потоками STA и MTA. Сохраняя это просто: граница квартиры обычно пересекается, когда вызов выполняется из другого потока, из другого процесса или с другой машины. COM нуждается в помощи, чтобы понять, как сериализовать аргументы вызова в пакете IPC и требует знания типа аргументов. В COM нет концепции Reflection, поэтому ее легко сделать автоматически. Требуется отдельная DLL, которая реализует прокси-сервер и заглушку, почти всегда генерируемые из файла IDL. Это трудно реализовать в .NET, вы почти всегда используете удобный второй способ, используя стандартный маршаллер, встроенный в Windows. В котором используется библиотека типов, чтобы узнать, какие типы аргументов. Параметр Regasm.exe/tlb обеспечивает регистрацию библиотеки прокси-сервера/заглушки интерфейса и типа, поэтому стандартный маршаллер может найти библиотеку.

  • Когда вы публикуете структуру в своем публичном интерфейсе. Структуры очень сложны в сценариях взаимодействия, они имеют макет, который сильно зависит от настроек компилятора. Эквивалентным свойством .NET является StructLayout.Pack. Исправлено в 8 в .NET, но код клиента этого не знает. Чтобы получить доступ к структуре, клиентский код должен использовать IRecordInfo. Это позволяет узнать, где находится каждое поле структуры в памяти. Библиотека типов предоставляет информацию, необходимую IRecordInfo. Конечно, лучше всего избегать структур полностью и очень легко сделать в .NET.

Ответ 2

У меня возникла проблема при регистрации DLL.Net, которая использовалась в COM-компоненте в качестве ссылок .tlb.

Поэтому вам не нужно регистрировать .Net dll (проект .tlb).

Я надеюсь, что это сработает.