带有COM Interop的VB.NET类,从VBA(Access)使用时缺少大多数属性

问题描述 投票:0回答:1

我编写了一个启用了COM Interop的VB.NET类,因此可以在VBA中使用 - 特别是MS Access。

该类在VB.NET中运行良好。使用Access,我可以添加对它的引用,实例化主对象并设置并返回一些属性。

但Access无法识别与主类下面的子类相关的任何内容。 VB.NET暴露这些类没有问题,但没有暴露VBA。

这仅仅是COM Interop和/或VBA的限制吗?

有解决方法吗?

vb.net ms-access com-interop
1个回答
1
投票

不,你不能让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中你可以通过智能获得这一点。

enter image description here

请仔细注意子类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中你得到这个:

enter image description here

请注意,class2 DOES显示为子类

如果我在VBA编辑器中点击“点”,那么子类方法显示如下:

enter image description here

所以很确定以上是让子类使用COM互操作的唯一方法

© www.soinside.com 2019 - 2024. All rights reserved.