Перегрузки в COM-взаимодействии (CCW) - имена IDispatch включают суффикс (_2, _3 и т. Д.)
У меня есть управляемая сборка, содержащая несколько классов, и эти классы имеют перегруженные методы. Выставляю сборку на звонилки COM / IDispatch через
[ComVisible(true)]
... и также установка правильного Guid на самой сборке. Я не определяю явный интерфейс для взаимодействия COM. Все это делается динамически. я бегуregasm.exe /codebase
на управляемой DLL, и это регистрирует это для COM-взаимодействия.
Когда я запускаю OleView, я вижу ProgId различных классов в сборке. Но, просматривая эти ProgIds и расширяя узел IDispatch, нет никакой информации TypeLib для этих классов.
Несмотря на это, из сценария я могу вызвать метод, который принимает нулевые аргументы, или метод, который принимает один аргумент. Если есть также перегрузка, которая принимает более одного аргумента, я не могу вызвать этот метод по имени. Ошибка, которую я получаю, постоянно
Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: <methodname>
Из этого я понял, что клиенты COM / IDispatch не могли должным образом разрешать перегруженные методы для объекта, доступного через взаимодействие COM.
Потом я добавил
[ClassInterface(ClassInterfaceType.AutoDual)]
... каждому из рассматриваемых классов. Послеregasm.exe
в DLL я вижу информацию о typelib для каждого метода в узле IDispatch.
Я обнаружил, что перегруженные методы автоматически получают имя с добавленным суффиксом. MethodX будет отображать перегрузки в автоматически сгенерированной сборке typelib как MethodX, MethodX_2, MethodX_3 и так далее.
И я обнаружил, что, ссылаясь на имена методов с этими суффиксами, я мог вызывать перегруженные методы, хотя и не с общим именем.
Более интересно, если я тогда удалил[ClassInterface(ClassInterfaceType.AutoDual)]
из классов, я могstill вызывать перегруженные методы таким образом, избегаяWrong number of arguments or invalid property assignment
ошибка.
Мой вопрос: стабильно ли это поведение - добавление числовых суффиксов к именам членов? документально? надежный?