调用Com接口,在C#会比较麻烦,最大的问题就是CLR静态类型在编译期就已经绑定了,需要一堆的反射+接口/类型的转换 但用VB.Net就不一样了,由于VB中类型可以后期绑定,获取到某接口的COM实例后,可以直接调用接口方法,但带来的问题就是类型安全以及调试的困难(由于存在AppDomain跨域问题,有些异常是捕获不到的,单步调试时会直接跳出调试)Public Class ComProxyPublic Sub New(typeCLSID As Guid) If typeCLSID = Guid.Empty Then Throw New ArgumentNullException("CLSID") End If Try Dim type As Type type = System.Type.GetTypeFromCLSID(typeCLSID) Me.ComObject = Activator.CreateInstance(type) Me._clsID = typeCLSID Catch exp As Exception Throw New System.ComponentModel.Win32Exception("Failed to create instance by CLSID for COM: " & typeCLSID.ToString(), exp) End Try End Sub Public Sub New(progID As String) If String.IsNullOrEmpty(progID) Then Throw New ArgumentNullException("progId") End If Try Me.ComObject = GetObject(, progID) 'VB方法 'Me.ComObject = Marshal.GetActiveObject(progID) 'Net方法 Me._progID = progID Catch exp As Exception Throw New System.ComponentModel.Win32Exception("Failed to create instance by ProgID for COM: " & progID, exp) End Try End Sub可以直接使用New ComProxy().COM接口方法() 会有编译警告 但好处也是很明显的
你知道一点,又不全知道,囫囵吞枣,不求甚解。你说的基本上是static variable,事实上还有在heap和stack上分配的。
但用VB.Net就不一样了,由于VB中类型可以后期绑定,获取到某接口的COM实例后,可以直接调用接口方法,但带来的问题就是类型安全以及调试的困难(由于存在AppDomain跨域问题,有些异常是捕获不到的,单步调试时会直接跳出调试)Public Class ComProxyPublic Sub New(typeCLSID As Guid)
If typeCLSID = Guid.Empty Then
Throw New ArgumentNullException("CLSID")
End If
Try
Dim type As Type
type = System.Type.GetTypeFromCLSID(typeCLSID)
Me.ComObject = Activator.CreateInstance(type)
Me._clsID = typeCLSID
Catch exp As Exception
Throw New System.ComponentModel.Win32Exception("Failed to create instance by CLSID for COM: " & typeCLSID.ToString(), exp)
End Try
End Sub Public Sub New(progID As String)
If String.IsNullOrEmpty(progID) Then
Throw New ArgumentNullException("progId")
End If
Try
Me.ComObject = GetObject(, progID) 'VB方法
'Me.ComObject = Marshal.GetActiveObject(progID) 'Net方法
Me._progID = progID
Catch exp As Exception
Throw New System.ComponentModel.Win32Exception("Failed to create instance by ProgID for COM: " & progID, exp)
End Try
End Sub可以直接使用New ComProxy().COM接口方法() 会有编译警告
但好处也是很明显的