Generics 和 Com Visible .NET 库

Generics and Com Visible .NET libraries

我已经开发了一个 VB.NET 库(部分也是在 C# 上开发的),它在很大程度上依赖于从抽象通用基础 class 继承,我正在努力找出最好的为此练习。遗憾的是,我不得不使用框架 3.5 来完成它。

Public MustInherit Class MyBaseClass(Of T)
  Public Whatever As T
End Class

Public Class MyDerivedClass
  Inherits MyBaseClass(Of String)

  Private _myProperty As String

  Public Property MyProperty As String
    Get
      Return _myProperty
    End Get
    Set(value As String)
      _myProperty = value
    End Set
  End Property
End Class

我在 VBA 中附加了 .tlb 文件作为参考(使用 Excel),并且我 运行 以下代码:

Dim m As New VBtoVBA.MyDerivedClass
m.MyProperty = "foo"

我收到错误 "Run-time error 430: Class does not support Automation or does not support expected interface"。

另一方面,我将第一行更改为:

Public MustInherit Class MyBaseClass
  Public Whatever As String
End Class

Public Class MyDerivedClass
  Inherits MyBaseClass

VBA 脚本有效。因此,我认为问题出在泛型上(其他来源也有记录)。但是,删除我的库的通用功能是不可能的。我能想到的 "best" 解决方法是编写第三个 class,其中包含 MyDerivedClass 作为字段,并作为它的非通用接口工作:

Public Class MyDerivedClassString

  Private _innerObj As New MyDerivedClass

  Public Property MyProperty As String
    Get
      Return _innerObj.MyProperty
    End Get
    Set(value As String)
      _innerObj.MyProperty = value
    End Set
  End Property

  Public Property Whatever As String
    Get
      Return _innerObj.Whatever
    End Get
    Set(value As String)
      _innerObj.Whatever = value
    End Set
  End Property

End Class

这样我就可以像在 VBA:

中一样使用它了
m.Whatever = "wha"
MsgBox (m.Whatever)

顺便说一句,我认为可能有另一种(更好的)方法可以达到相同的结果,我真的希望如此,因为 m 库由几十个 classes 组成。

非常感谢。

正如我在 MS Office 应用程序的评论编写库 (dll) 中提到的那样……是硬编码的。此 dll 必须公开方法和属性才能在 COM 自动化中使用它。为了能够实现这一点,您需要编写接口:

Namespace VBtoVBA
    Public Interface IMyDerivedClass
        Property MyProperty As String
    End Interface
End Namespace

然后在 DerivedClass

Public Class MyDerivedClass
    Inherits MyBaseClass(Of String)
    Implements IMyDerivedClass

    Private _myProperty As String

    Public Property MyProperty As String Implements IMyDerivedClass.MyProperty

现在,转到 Project Properties window 1) 选择 Application 选项卡 - 单击 Assembly Information 按钮并在下一个 window select Make assembly COM visible 复选框中(使用 OK 按钮应用设置),

2) 选择 Compile 选项卡 - select Register for COM interop 复选框

3) 保存项目并构建 dll

4) 现在,转到 VBA Office 应用程序中的代码编辑器 -> References 菜单。在 Reference window 中添加对 yourDllName.tlb

的引用

现在,您可以在 Office 应用程序中使用您的 dll ;)

我测试了代码:

Option Explicit

Sub DoSomething()
Dim m As VBtoVBA.MyDerivedClass

Set m = New VBtoVBA.MyDerivedClass

m.MyProperty = "Something"

MsgBox m.MyProperty


End Sub

而且效果也很好 ;)