COM互操作(CCW)中的重载 - IDispatch名称包括后缀(_2,_3等)

Che*_*eso 2 .net com interop typelib regasm

我有一个包含几个类的托管程序集,这些类有重载方法.我将程序集暴露给COM/IDispatch调用者

[ComVisible(true)]
Run Code Online (Sandbox Code Playgroud)

..还要在装配本身上设置合适的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>
Run Code Online (Sandbox Code Playgroud)

由此我了解到COM/IDispatch客户端无法正确解析通过COM互操作公开的对象上的重载方法.


然后我补充说

[ClassInterface(ClassInterfaceType.AutoDual)]
Run Code Online (Sandbox Code Playgroud)

......对每个有关的课程.在regasm.exeDLL之后,我可以在IDispatch节点下看到每个方法的typelib信息.

我发现重载方法会自动获得包含附加后缀的名称.MethodX将在自动生成的类型库组件中公开重载,如MethodX,MethodX_2,MethodX_3等.

我发现通过引用具有这些后缀的方法名称,我可以调用重载方法,尽管不是通用名称.

更有趣的是,如果我然后[ClassInterface(ClassInterfaceType.AutoDual)]从类中删除了,我仍然可以通过这种方式调用重载方法,从而避免 Wrong number of arguments or invalid property assignment错误.

我的问题是:这种行为 - 将数字后缀附加到成员名称 - 稳定吗?记录?可信?

Pav*_*aev 5

COM不支持方法重载,因此.NET COM Interop层必须即兴发挥.我不确定你所描述的名称是否记录在任何地方,但即使是,我也不认为使用它是一个好主意 - 对于COM用户来说它仍然是非常不方便的API.如果要将类公开给COM,最好的方法是编写一个独特的COM友好[ComVisible]界面,并隐藏类本身.以COM友好的方式处理重载的正确方法是使用一个带有一些[Optional]参数的方法(并委托相应的.NET重载).