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错误.
我的问题是:这种行为 - 将数字后缀附加到成员名称 - 稳定吗?记录?可信?
COM不支持方法重载,因此.NET COM Interop层必须即兴发挥.我不确定你所描述的名称是否记录在任何地方,但即使是,我也不认为使用它是一个好主意 - 对于COM用户来说它仍然是非常不方便的API.如果要将类公开给COM,最好的方法是编写一个独特的COM友好[ComVisible]界面,并隐藏类本身.以COM友好的方式处理重载的正确方法是使用一个带有一些[Optional]参数的方法(并委托相应的.NET重载).
| 归档时间: |
|
| 查看次数: |
1561 次 |
| 最近记录: |