gpt4 book ai didi

.net - COM 互操作 (CCW) 中的重载 - IDispatch 名称包含后缀(_2、_3 等)

转载 作者:行者123 更新时间:2023-12-02 07:55:08 26 4
gpt4 key购买 nike

我有一个包含几个类的托管程序集,这些类有重载方法。我通过

将程序集公开给 COM/IDispatch 调用者
[ComVisible(true)]

..并在程序集本身上设置正确的 Guid。我没有为 COM 互操作定义显式接口(interface)。这一切都是动态完成的。我在托管 DLL 上运行 regasm.exe/codebase 并将其注册为 COM 互操作。

当我运行 OleView 时,我可以看到程序集中各个类的 ProgId。但是,浏览那些 ProgIds 并展开 IDispatch 节点,没有这些类的 TypeLib 信息。

即便如此,我仍可以从脚本中调用一个接受零个参数的方法或一个接受一个参数的方法。如果还有一个重载接受多个参数,我就不能按名称调用该方法。我一直得到的错误是

Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment:  <methodname>

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


然后我添加了

[ClassInterface(ClassInterfaceType.AutoDual)]

...到每个有问题的类(class)。在 DLL 上的 regasm.exe 之后,我可以在 IDispatch 节点下看到每个方法的类型库信息。

我发现重载方法会自动获得一个包含附加后缀的名称。 MethodX 会将自动生成的类型库程序集中的重载公开为 MethodX、MethodX_2、MethodX_3 等。

而且我发现通过引用带有这些后缀的方法名称,我可以调用重载方法,尽管不是使用通用名称。

更有趣的是,如果我随后从类中删除了 [ClassInterface(ClassInterfaceType.AutoDual)],我仍然可以以这种方式调用重载方法,从而避免参数数量错误或属性分配无效 错误。

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

最佳答案

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

关于.net - COM 互操作 (CCW) 中的重载 - IDispatch 名称包含后缀(_2、_3 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com