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
而且效果也很好 ;)
我已经开发了一个 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
而且效果也很好 ;)