Ответ 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.