我正在通过 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
设为默认值。
为什么会出现这种情况?我实际上不想要默认属性,它的存在掩盖了一个“刚刚起作用”的编码错误,基本上是偶然的。
正如 Hans Passant 在评论中所述:
Tlbexp.exe 可以做到这一点。使用 oleview.exe 查看类型库,文件 > 查看类型库。
[dispid] 自动生成没有记录,但这并不是完全不明智的。使用 [DispId] 属性来覆盖。
[Tlbexp 似乎确实在寻找一个名为“Value”的属性来用于此目的]。顺便说一句,如果你给班级一个索引器,可能会很有趣。