VB. NET класс получает имя сборки перед именем в COM? - PullRequest
1 голос
/ 04 февраля 2020

У меня есть. NET COM-сборка A состоит из 3 классов, скажем B, C и D. Я использую для обозначения этого COM DLL из моего VB6 как A.B, A.C и A.D.

Недавно, когда я пытался перекомпилировать свой проект VB6, я все еще могу ссылаться на A.B и A.C.

Но класс D отображается как A.A_D в браузере объектов VB6. Мой вопрос заключается в том, почему Class Name и Underscore добавляются в класс D.

Я использую. NET framework 4.0 для DLL. Найдите ниже Псевдокод для вашей справки. ProgID не используется. Вместо этого прямая ссылка на объект используется в VB6.

Класс A: настроен как библиотека классов

Класс B:

<ComClass(B.ClassId, B.InterfaceId, B.EventsId), ComVisible(True)> Public Class B

#Region "COM GUIDs"
    'All the real GUIDs/Interface/Events are replaced with zeros for code security purpose
    Public Const ClassId As String = "0000000-0000-0000-0000-000000000000"
    Public Const InterfaceId As String = "00000000-0000-0000-0000-000000000000"
    Public Const EventsId As String = "00000000-0000-0000-0000-000000000000"
#End Region

Класс C:

<ComClass(C.ClassId, C.InterfaceId, C.EventsId), ComVisible(True)> Public Class C

#Region "COM GUIDs"
    'All the real GUIDs/Interface/Events are replaced with zeros for code security purpose
    Public Const ClassId As String = "0000000-0000-0000-0000-000000000000"
    Public Const InterfaceId As String = "00000000-0000-0000-0000-000000000000"
    Public Const EventsId As String = "00000000-0000-0000-0000-000000000000"
#End Region

Класс D:

<ComClass(D.ClassId, D.InterfaceId, D.EventsId), ComVisible(True)> Public Class D

#Region "GUIDs"
    'All the real GUIDs are replaced with zeros
    Friend Const ClassId As String = "00000000-0000-0000-0000-000000000000"
    Friend Const InterfaceId As String = "00000000-0000-0000-0000-000000000000"
    Friend Const EventsId As String = "00000000-0000-0000-0000-000000000000"
#End Region

В одном только OLEView к классу D добавляется пространство имен A. Класс B и C остаются теми же. Когда я возвращал эту DLL-библиотеку обратно, к пространству имен добавляется только после перехода на Framework 4. Эта проблема, похоже, похожа на проблему, упомянутую в prepending-namespace-to-typelib-coclass-name Но разница здесь в том, Я все еще использую Visual Studio 2010, и я не нахожу

Свойство Вставить типы взаимодействия

OLEView.exe Вывод

coclass D

[uuid(00000000-0000-0000-0000-000000000000),
version(1.0),
custom({00000000-0000-0000-0000-000000000000}, "A.D")]

coclass A_D {
    interface _Object;
    [default] interface _D;
    [default, source] dispinterface __D;
};

coclass B

[uuid(00000000-0000-0000-0000-000000000000),
version(1.0),
custom({00000000-0000-0000-0000-000000000000}, "A.B")]

coclass B{
   interface _Object;
   [default] interface _B;
   [default, source] dispinterface __B;
};

1 Ответ

1 голос
/ 05 февраля 2020

Не видя реального имени класса для D, невозможно быть уверенным. Но вероятная возможность состоит в том, что простое имя D будет конфликтовать с чем-то другим, и поэтому компилятор (*) добавляет имя сборки к различению guish it.

Если вы хотите подтвердить это Вы можете загрузить файл .TLB для вашей сборки в OLEView или в похожем инструменте и проверить IDL, который, вероятно, будет отображать то же имя A_D.

Еще один тест - изменить D почти на что-нибудь еще и перекомпилируйте и посмотрите, имеет ли это какой-либо эффект.

Как отмечено в комментарии, использование атрибута [ProgId] может быть способом заставить его предоставить более желательное имя в библиотеке типов.

(* Не совсем компилятор, но инструменты, которые генерируют слой оболочки COM и библиотеку типов)

...