gpt4 book ai didi

c# - DispID 必须跨接口(interface)唯一?

转载 作者:太空狗 更新时间:2023-10-29 21:18:08 26 4
gpt4 key购买 nike

我将 COM 与旧的 VB6 应用程序一起使用。

我更改了代码以在接口(interface)中使用 DispID,因为它似乎比使用 [ClassInterface(ClassInterfaceType.AutoDual)] 效果更好。

但是是否允许从 DispID(1) 开始计算每个接口(interface),即使一个类使用两个接口(interface)?

这样稳定吗?还是我误解了什么?

[ComVisible(true)]
[Guid("9E1125A6-...")]
public interface IMyInterface1
{
[DispId(1)]
string Name1 { get; }
}

[ComVisible(true)]
[Guid("123425A6-...")]
public interface IMyInterface2
{
[DispId(1)]
string Name2 { get; }
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
class MyClass : IMyInterface1, IMyInterface2
{
public string Name1 { get { return "Name1"; } }
public string Name2 { get { return "Name2"; } }
}

最佳答案

Is it allowed to begin in each interface counting from DispID(1), even when a class uses two interfaces?

DISPID 必须仅在接口(interface)内是唯一的。您最好使用两个接口(interface),每个接口(interface)都有自己的(不同的)DISPID 1 属性,即使这两个接口(interface)都是由同一个 COM 对象实现的。

但是,由于提到了 VB6,您需要记住 VB6 不喜欢在同一个 COM 对象上实现 2+ 个调度接口(interface),并且可能只“看到”第一个/主要接口(interface)。也就是说,问题不是 DISPID 冲突(这根本不是问题),而是 VB6 无法正确处理暴露 2+ 双接口(interface)的对象这一事实。 Multiple Dual Interfaces 中的 MSDN 中描述了发生这种情况的原因。 :

Because only one IDispatch interface is exposed, clients that can only access your objects through the IDispatch interface will not be able to access the methods or properties in any other interface.

可悲的是,VB6 就是这种情况。与更高级的环境不同,它以“任何其他接口(interface)中的方法或属性”不可访问的方式查询接口(interface)。不过,分配不同的 DISPID 无济于事。

关于c# - DispID 必须跨接口(interface)唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16216107/

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