У меня есть управляемая сборка, содержащая несколько классов, и эти классы имеют перегруженные методы. Я предоставляю сборку вызывающим COM/IDispatch через
[ComVisible(true)]
.. а также установить правильный Guid на самой сборке. Я не определяю явный интерфейс для COM-взаимодействия. Все делается динамически. Я запускаю regasm.exe /codebase
в управляемой DLL, и она регистрирует ее для COM-взаимодействия.
Когда я запускаю OleView, я вижу ProgId различных классов в сборке. Но при просмотре этих ProgId и расширении узла 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 будет предоставлять перегрузки в автоматически сгенерированной сборке библиотеки типов как MethodX, MethodX_2, MethodX_3 и т. д.
И я обнаружил, что, ссылаясь на имена методов с этими суффиксами, я могу вызывать перегруженные методы, хотя и не с обычным именем.
Что еще интереснее, если бы я затем удалил [ClassInterface(ClassInterfaceType.AutoDual)]
из классов, я мог бы по-прежнему вызывать перегруженные методы таким образом, избегая, таким образом, ошибки Wrong number of arguments or invalid property assignment
.
У меня вопрос: стабильно ли такое поведение — добавление числовых суффиксов к именам членов? задокументировано? надежный?