vb.net – 当COM属性不正确/丢失时,编译器不会出错?
发布时间:2020-12-17 07:13:34 所属栏目:百科 来源:网络整理
导读:我有一个VB6项目,当前正在编译,即使我正在访问一个不存在的属性. 代码看起来有点像这样: Public vizSvrEmp As VizualServer.EmployeesSet vizSvrEmp = New VizualServer.EmployeesFn = FreeFileOpen vizInfo.Root "FILE.DAT" For Random As #Fn Len = RecLe
我有一个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属性在对象中不存在但仍然编译. 我尝试删除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)> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |