当前位置 : 主页 > 编程语言 > c语言 >

vb.net – 当COM属性不正确/丢失时,编译器不会出错?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我有一个VB6项目,当前正在编译,即使我正在访问一个不存在的属性. 代码看起来有点像这样: Public vizSvrEmp As VizualServer.EmployeesSet vizSvrEmp = New VizualServer.EmployeesFn = FreeFileOpen vizInfo.Root "FI
我有一个VB6项目,当前正在编译,即使我正在访问一个不存在的属性.

代码看起来有点像这样:

Public vizSvrEmp As VizualServer.Employees
Set vizSvrEmp = New VizualServer.Employees

Fn = FreeFile
Open vizInfo.Root & "FILE.DAT" For Random As #Fn Len = RecLen
Do While Not EOF(Fn)
    Get #Fn, , ClkRecord
    With vizSvrEmp
        Index = .Add(ClkRecord.No)
        .NotAvailable(Index) = ClkRecord.NotAvailable
        .Bananas(Index) = ClkRecord.Start
        'Plus lots more properties
    End With
Loop

Bananas属性在对象中不存在但仍然编译.
我的vizSvrEmp对象是一个.NET COM Interop DLL并且是早期绑定的,如果我在中键入点,我会正确获取Intellisense(不显示Bananas)

我尝试删除With但行为相同

如何确保编译器拾取这些错误?

我知道你已经在Hans的帮助下解决了这个问题但是为了完整性,使用ClassInterface(ClassInterfaceType.AutoDual)的替代方法是使用ClassInterface(ClassInterfaceType.None)然后实现一个用InterfaceType修饰的显式接口( ComInterfaceType.InterfaceIsDual)取代.

这是更多的工作,但让您完全控制接口GUID.编译时,AutoDual将自动为接口生成唯一的GUID,这样可以节省时间,但是您无法控制它们.

在使用中,这看起来像这样:

<ComVisible(True), _
Guid(Guids.IEmployeeGuid), _
InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface IEmployee 

   <DispIdAttribute(1)> _
   ReadOnly Property FirstName() As String

   <DispIdAttribute(2)> _
   ReadOnly Property LastName() As String

   <DispIdAttribute(3)> _
   Function EtcEtc(ByVal arg As String) As Boolean

End Interface


<ComVisible(True), _
Guid(Guids.EmployeeGuid), _
ClassInterface(ClassInterfaceType.None)> _
Public NotInheritable Class Employee
   Implements IEmployee 

   Public ReadOnly Property FirstName() As String Implements IEmployee.FirstName
      Get
         Return "Santa"
      End Get
   End Function

   'etc, etc

End Class

请注意如何声明GUID.我发现创建一个帮助类来整合GUID并提供Intellisense很好的工作:

Friend Class Guids
   Public Const AssemblyGuid As String = "BEFFC920-75D2-4e59-BE49-531EEAE35534"   
   Public Const IEmployeeGuid As String = "EF0FF26B-29EB-4d0a-A7E1-687370C58F3C"
   Public Const EmployeeGuid As String = "DE01FFF0-F9CB-42a9-8EC3-4967B451DE40"
End Class

最后,我在汇编级别使用它们:

'The following GUID is for the ID of the typelib if this project is exposed to COM
<Assembly: Guid(Guids.AssemblyGuid)> 

'NOTE:  The following attribute explicitly hides the classes, methods, etc in 
'        this assembly from being exported to a TypeLib.  We can then explicitly 
'        expose just the ones we need to on a case-by-case basis.
<Assembly: ComVisible(False)> 
<Assembly: ClassInterface(ClassInterfaceType.None)>
网友评论