我有一个VB6项目,当前正在编译,即使我正在访问一个不存在的属性. 代码看起来有点像这样: Public vizSvrEmp As VizualServer.EmployeesSet vizSvrEmp = New VizualServer.EmployeesFn = FreeFileOpen vizInfo.Root "FI
代码看起来有点像这样:
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)>