我有一个.NET COM程序集A
包含3个类,例如B
,C
和D
。我曾经从我的VB6引用此COM dll为A.B
,A.C
和A.D
。
最近,当我尝试重新编译VB6项目时,仍然可以引用A.B
和A.C
。
但是[V0]类在VB6对象浏览器中公开为D
。我的问题是,为什么将类名和下划线附加到类A.A_D
。
我正在使用.NET Framework 4.0 for DLL。在下面找到伪代码供您参考。不使用ProgID。而是在VB6中使用对对象的直接引用。
A类:配置为类库
B类:
D
C类:
<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
D类:
<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
没有看到<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
的真实类名,这是不确定的。但是一种可能的可能性是,裸名D
会与其他名称冲突,因此编译器(*)添加了程序集名称来区分它。
如果要确认这一点,可以在OLEView或类似工具中为程序集加载D
文件并检查IDL,它可能显示相同的.TLB
名称。
另一项测试是将A_D
更改为几乎所有其他内容,然后重新编译,看看是否有任何效果。
(*不是真正的编译器,而是生成COM包装层和类型库的工具]