tlbimp: как раннее связывание работает с "/noclassmembers"?

Я играл с tlbimp и нашел /noclassmembers вариант и мне понравился

Ahhah! Могу поспорить, что рано сломать обязательство!

Но, к моему большому огорчению, казалось, что все работает нормально даже при использовании сборки взаимодействия, созданной с помощью этой опции. То есть при замене в этой новой сборке взаимодействия не было проблем компиляции (или явных проблем во время выполнения на моем тестовом компьютере).

Итак, что именно делает /noclassmembers и почему не стоит всегда использовать эту опцию?

Учтите следующее:

  1. По-видимому, иногда требуется "избежать исключения TypeLoadError", и
  2. Получившаяся сборка взаимодействия меньше (в моем случае она составляет всего 3/4 размера)

(Судя по размерам файлов, в Visual Studio автоматически созданная сборка взаимодействия не использует эту опцию.)

Благодарю.

1 ответ

Решение

COM использует интерфейсную модель программирования. Сам кокласс не должен предоставлять никаких членов, он реализует интерфейсы и предоставляет их с помощью IUnknown::QueryInterface(). Библиотека типов, тем не менее, не запрещает коклассу выставлять своих собственных членов. Следует отметить, что это происходит с управляемыми классами, которые являются [ComVisible] и не применяют атрибут [ClassInterface(ClassInterfaceType.None)]. Эти видимые подробности реализации могут быть источником исключения TypeLoadException.

Поэтому неудивительно, что при использовании этой опции это не вызывает каких-либо проблем, а клиентский код с хорошим поведением будет использовать только открытые интерфейсы. Вы можете использовать утилиту oleview.exe SDK, чтобы взглянуть на библиотеку типов и увидеть, что вы видите. Используйте File + View Typelib и выберите.tlb или.dll

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