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