1

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

有没有办法让这些以正常、可用的名称导出?我错过了一个属性还是什么?


COM/VB6 中名称的格式为:

<original_name>k__BackingField

只有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
}

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

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

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

4

1 回答 1

4

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

private string _stringA_BackingField;
public string StringA
{
  get { return _stringA_BackingField; }
  set { _stringA_BackingField = value; }
}

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

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

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

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

于 2019-09-06T22:05:17.687 回答