tlbimp: как раннее связывание работает с "/ noclassmembers"? - PullRequest
1 голос
/ 24 января 2012

Я играл с tlbimp , нашел вариант /noclassmembers и мне было сказано:

Аххах!Могу поспорить, что это нарушит раннее связывание!

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

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

Примите во внимание следующее:

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

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

Спасибо.

1 Ответ

2 голосов
/ 24 января 2012

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

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

...