0

我有下面的结构,它正在为 COM 互操作编译。我收到以下构建警告:

警告:类型库导出器警告处理“MyNamespace.MyStruct.k__BackingField,MyAssemblyName”。警告:公共结构包含一个或多个将被导出的非公共字段

但我看不出它指的是什么——根本没有非公共领域或领域。也许编译器正在生成我看不到的东西?这个警告是什么意思,如果我能做些什么来清理它?

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

[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;
    }

    public MyStruct(MyStruct other)
    {
        StringA = other.StringA;
        StringB = other.StringB;
    }

    public override bool Equals(object obj)
    {
        if (!(obj is MyStruct)) return false;
        var other = (MyStruct)obj;
        return
            other.StringA == this.StringA &&
            other.StringB == this.StringB;
    }

    public static bool operator ==(MyStructa, MyStructb) => a != null && a.Equals(b);
    public static bool operator !=(MyStructa, MyStructb) => !(a == b);
    public override int GetHashCode() => ToString().GetHashCode();

    public override string ToString() => $"{StringA}-{StringB}";
}

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

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

由 OleView 生成。我可以看到它包含与k__BackingField警告中相同的内容 - 但不清楚这意味着什么。

4

1 回答 1

4

您正在使用自动属性:

public string StringA { get; set; }

编译器会为它们中的每一个自动生成一个支持字段。这正是

MyNamespace.MyStruct.k__BackingField

指的是。


您收到警告是因为暴露私有字段可能是无意的或可能导致安全问题。由开发人员来验证是否是这种情况。在您的具体示例中,不会违反封装,因此可以忽略警告或禁止警告。另请参阅MSDN的官方文档:

何时禁止警告

如果可以接受该场的公开暴露,则可以安全地取消该规则的警告。

于 2019-09-06T19:49:06.583 回答