Matt T Heffron Ответов: 1

Почему TLB, сгенерированный из сборки C#, строчит начальный символ некоторых имен свойств?


Это странно:
У меня есть интерфейс на языке Си#:
[ComVisible(true)]
[Guid("24BDD90E-373B-400F-B374-1350CDB9FE76")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGURecord
{
  [DispId(1)]
  string Id { get; }
  [DispId(2)]
  double GUValue { get; }
  [DispId(3)]
  double RelativeMigrationTime { get; }
  [DispId(4)]
  string GlycanName { get; }
  [DispId(5)]
  double MonoisotopicMass { get; }
}

В сгенерированном .TLB свойства GUValue, RelativeMigrationTime и GlycanName получают начальные символы в нижнем регистре:
interface IGURecord : IDispatch {
    [id(0x00000001), propget]
    HRESULT Id([out, retval] BSTR* pRetVal);
    [id(0x00000002), propget]
    HRESULT guValue([out, retval] double* pRetVal);
    [id(0x00000003), propget]
    HRESULT relativeMigrationTime([out, retval] double* pRetVal);
    [id(0x00000004), propget]
    HRESULT glycanName([out, retval] BSTR* pRetVal);
    [id(0x00000005), propget]
    HRESULT MonoisotopicMass([out, retval] double* pRetVal);
};

Есть ли у кого-нибудь идеи о том, почему это может произойти?

Что я уже пробовал:

В этой сборке C# нет ничего необычного.
Это против 2013 года.
Я проверил "Register for COM interop" в настройках сборки проекта.
В этой сборке есть и другие интерфейсы, определенные аналогичным образом, которые не видят этой проблемы.

1 Ответов

Рейтинг:
9

Matt T Heffron

Ладно, я пойду претензия это ошибка, хотя я не знаю, находится ли это в Visual Studio или в REGASM.exe когда он создает библиотеку типов:

Кажется, что где-то по ходу процесса идентификаторы не считаются полностью уникальными на основе оболочки. У меня были методы на других ComVisible интерфейсах, которые имели параметры, которые использовали те же идентификаторы, что и здесь, за исключением ведущего нижнего регистра.
Я также заметил кое-что еще: у меня были параметры для некоторых методов, которые были обработаны так же, как и разные имена свойств.

По наитию я переименовал все имена свойств метода, чтобы они не совпадали ни с какими идентификаторами с другим корпусом.
Это решило проблему.
Все идентификаторы в библиотеке типов теперь имеют тот же корпус, что и в определяющих интерфейсах C#.