"Публичная структура содержит одно или несколько закрытых полей, которые будут экспортированы" - но нет полей?
У меня есть структура ниже, которая компилируется для 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
как в предупреждении - но не ясно, что это значит.
1 ответ
Вы используете автоматические свойства:
public string StringA { get; set; }
Компилятор автоматически генерирует резервное поле для каждого из них. Это именно то, что
MyNamespace.MyStruct.k__BackingField
имеет в виду.
Вы получаете предупреждение, потому что раскрытие закрытого поля может быть непреднамеренным или может привести к проблемам с безопасностью. Разработчик должен проверить, так ли это. В вашем конкретном примере не будет нарушения инкапсуляции, поэтому можно игнорировать предупреждение или подавить его. См. Также официальную документацию по этому поводу от MSDN:
Когда подавлять предупреждения
Можно безопасно отключить предупреждение из этого правила, если допускается публичное обнажение поля.