C# 结构体的属性在 COM 和 VB6 中获得不可用的名称?

Dav*_*Caz 1 c# vb6 struct tlbexp com-interop

我的 C# 代码有一个struct要导出到 COM 的代码。该结构的属性带有奇怪的名称,这些名称甚至在 VB6 中都不是有效语法,因此无法访问它们。

有什么方法可以让它们以正常、可用的名称导出吗?我是否缺少某个属性或其他内容?


COM/VB6 中名称的格式为:

<original_name>k__BackingField
Run Code Online (Sandbox Code Playgroud)

其中只有original_name部分位于我的 C# 代码中。

我只能在 VB6 对象浏览器中看到这些疯狂的属性名称,Intellisense 不会显示它。

这是正在构建的(稍微清理过的)代码:

[Guid("....")]
[ComVisible(true)]
public struct MyStruct
{
    public string StringA { get; set; }
    public string StringB { get; set; }

    public MyStruct(string a, string b)
    {
        StringA = a;
        StringB = b;
    }

    ... // some other methods, no fields or properties
}
Run Code Online (Sandbox Code Playgroud)

为了更好地衡量,这里是生成的 IDL:

typedef [uuid(....), version(1.0), custom(xxxx, MyNamespace.MyStruct)]
struct tagMyStruct {
    LPSTR <StringA>k__BackingField;
    LPSTR <StringB>k__BackingField;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

如 OleView 所示。我可以看到它包含k__BackingField与上面提到的相同的内容。因此,这些名称似乎来自 C# typelib 导出过程。

Joh*_*zer 5

public string StringA { get; set; }只是以下的一个简短形式

private string _stringA_BackingField;
public string StringA
{
  get { return _stringA_BackingField; }
  set { _stringA_BackingField = value; }
}
Run Code Online (Sandbox Code Playgroud)

由于 COM 结构仅包含字段而不包含属性,因此您将看到支持字段。如果您将代码更改为以下内容,您的示例应该可以工作:

[Guid("....")]
[ComVisible(true)]
public struct MyStruct
{
    public string StringA;
    public string StringB;
}
Run Code Online (Sandbox Code Playgroud)

根据定义,该struct类型是一种值类型,通常用于封装一小组相关变量。

如果您想提供属性或方法,您需要使用class. 您可以在此处找到有关结构的更多信息: