我有一个包含几个类的托管程序集,这些类具有重载方法。我通过以下方式将程序集公开给 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 之后,我可以在 IDispatch 节点下看到每个方法的类型库信息。
我发现重载的方法会自动获得一个包含附加后缀的名称。MethodX 将在自动生成的 typelib 程序集中公开重载为 MethodX、MethodX_2、MethodX_3 等。
而且我发现通过引用带有这些后缀的方法名称,我可以调用重载方法,尽管不是使用通用名称。
更有趣的是,如果我随后[ClassInterface(ClassInterfaceType.AutoDual)]
从类中删除 ,我仍然可以以这种方式调用重载方法,从而避免 Wrong number of arguments or invalid property assignment
错误。
我的问题是:这种行为 - 将数字后缀附加到成员名称 - 稳定吗?记录在案?可信?