Свойства структур C# получают непригодные для использования имена в COM и VB6?

В моем коде 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#.

1 ответ

Решение

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 type - это тип значения, который обычно используется для инкапсуляции небольших групп связанных переменных.

Если вы хотите предоставить свойства или методы, вам необходимо использовать class. Здесь вы найдете дополнительную информацию о структурах:

Другие вопросы по тегам