tlbimp: как раннее связывание работает с "/noclassmembers"?
Я играл с tlbimp и нашел /noclassmembers
вариант и мне понравился
Ahhah! Могу поспорить, что рано сломать обязательство!
Но, к моему большому огорчению, казалось, что все работает нормально даже при использовании сборки взаимодействия, созданной с помощью этой опции. То есть при замене в этой новой сборке взаимодействия не было проблем компиляции (или явных проблем во время выполнения на моем тестовом компьютере).
Итак, что именно делает /noclassmembers
и почему не стоит всегда использовать эту опцию?
Учтите следующее:
- По-видимому, иногда требуется "избежать исключения TypeLoadError", и
- Получившаяся сборка взаимодействия меньше (в моем случае она составляет всего 3/4 размера)
(Судя по размерам файлов, в Visual Studio автоматически созданная сборка взаимодействия не использует эту опцию.)
Благодарю.
1 ответ
COM использует интерфейсную модель программирования. Сам кокласс не должен предоставлять никаких членов, он реализует интерфейсы и предоставляет их с помощью IUnknown::QueryInterface(). Библиотека типов, тем не менее, не запрещает коклассу выставлять своих собственных членов. Следует отметить, что это происходит с управляемыми классами, которые являются [ComVisible] и не применяют атрибут [ClassInterface(ClassInterfaceType.None)]. Эти видимые подробности реализации могут быть источником исключения TypeLoadException.
Поэтому неудивительно, что при использовании этой опции это не вызывает каких-либо проблем, а клиентский код с хорошим поведением будет использовать только открытые интерфейсы. Вы можете использовать утилиту oleview.exe SDK, чтобы взглянуть на библиотеку типов и увидеть, что вы видите. Используйте File + View Typelib и выберите.tlb или.dll