我编写了一个启用了COM Interop的VB.NET类,因此可以在VBA中使用 - 特别是MS Access。
该类在VB.NET中运行良好。使用Access,我可以添加对它的引用,实例化主对象并设置并返回一些属性。
但Access无法识别与主类下面的子类相关的任何内容。 VB.NET暴露这些类没有问题,但没有暴露VBA。
这仅仅是COM Interop和/或VBA的限制吗?
有解决方法吗?
不,你不能让interop为你生成子类(出现在VBA中)
但是,请记住,嵌套类与非嵌套类非常相似。无论如何都要初始化该子类实例。如果这些课程要分开,你就无法做到。您可以在一个代码模块中放置许多类。
所以这纯粹是你正在寻找的语法偏好。
但是,您可以在主类中声明任何子类的公共实例(变量区域为public)。
举个简单的例子吧。
Imports System.Runtime.InteropServices
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class Class1
Private m_Company As String = ""
Public Function MyHello()
MsgBox("Hello world")
End Function
Public Property Company As String
Get
Return m_Company
End Get
Set(value As String)
m_Company = value
End Set
End Property
<ClassInterface(ClassInterfaceType.AutoDual)>
Public Class Class2
Private m_FirstValue As Integer = 2
Public Property V1 As Integer
Get
Return m_FirstValue
End Get
Set(value As Integer)
m_FirstValue = value
End Set
End Property
Public Function MyTimes2() As Integer
Return m_FirstValue * 2
End Function
End Class
End Class
注意上面的嵌套类“class2”。
好的,所以检查make com程序集visible = True,并进行测试检查“register for com interop”
编译上面的内容,在Access中设置引用。 (注意你不必构建自定义界面!!!)。
现在,在VBA中你可以通过智能获得这一点。
请仔细注意子类Class2如何不出现。
如果你真的想要出现英特尔和子类,那么到上面的vb.net类,简单地添加这个;
Public Class Class1
Private m_Company As String = ""
Public SClass2 As New Class2 <--- add this line to expose as public
Private m_Company As String = ""
.etc. etc. etc.
现在我从名称中加入一个“S” - 遗憾的是你不能使用与嵌套类相同的名字。 (所以要么把东西放在嵌套类的前面,要么放在那个类的公共实例前面(这就是我上面所做的)。
现在如果我们编译,那么在VBA中你得到这个:
请注意,class2 DOES显示为子类
如果我在VBA编辑器中点击“点”,那么子类方法显示如下:
所以很确定以上是让子类使用COM互操作的唯一方法