有默认的默认属性吗?

问题描述 投票:0回答:1

我正在通过 COM 互操作将 C# 类导出到 VB6。 它似乎有一个默认的 COM 属性,而我从未设置过!

C# 类如下所示:

[ComVisible(true), ClassInterface(ClassInterfaceType.AutoDual)]
class Foo
{
     public int I { get; set; }
     public bool B { get; set; }
     public int Value { get; set; }  // <--- the culprit
     public string S { get; set; }
}

(我知道为什么我不应该使用autodual - 请忽略这一点,它对这个阶段的开发很有用)

属性

Value
在 VB6 中的行为是默认的。在对象浏览器中以这种方式显示。但请注意,我没有设置
DispId
attribute 来指示默认值。

此外,在 OLEView 中,您可以看到在程序集的

IDL
TLB
中,Value 属性具有 attribute
[id(00000000), propget]
。这个相当于
DISPID_VALUE
。因此,由于某种原因,编译器或 TLBEXP 或其他东西明确将
Value
设为默认值。

为什么会出现这种情况?我实际上不想要默认属性,它的存在掩盖了一个“刚刚起作用”的编码错误,基本上是偶然的。

c# com-interop idl
1个回答
0
投票

正如 Hans Passant 在评论中所述:

Tlbexp.exe 可以做到这一点。使用 oleview.exe 查看类型库,文件 > 查看类型库。

[dispid] 自动生成没有记录,但这并不是完全不明智的。使用 [DispId] 属性来覆盖。

[Tlbexp 似乎确实在寻找一个名为“Value”的属性来用于此目的]。顺便说一句,如果你给班级一个索引器,可能会很有趣。

© www.soinside.com 2019 - 2024. All rights reserved.