如何在.net环境中开发可以在VBA中引用的动态链接库

最近请朋友用VB.net开发了一个控制仪器的动态链接库,他生成了PM317.dll和PM317.tlb两个文件交给我。我把这两个文件拷贝到本地硬盘,在VBA中可以引用PM317.tlb。

img

他给我的VB.net引用例程如下(其中标红的是创建对象的关键语句):

img

我在VBA中的引用代码如下:

img

其中,对象InstrPM无法列出其成员。用VBA的对象浏览器浏览,发现Instrument的成员是空的

img

我的朋友无法解决这个问题,请大家指教。

在 VBA 中引用 DLL:在 VBA 中打开引用对话框,然后选择刚才生成的 DLL,即可在 VBA 中使用该 DLL。
使用 DLL:您现在可以在 VBA 代码中调用 .NET 代码,以使用您实现的功能。
请注意,要在 VBA 中使用 .NET DLL,该 DLL 必须是基于 .NET Framework,而不是 .NET Core。另外,请确保您在 VBA 中使用的版本与您开发的 .NET 版本相匹配。

我简单你可以尝试使用反射来访问PM317.dll中的类和成员,这样子可以在VBA中访问它们。
举个栗子:可以使用VBA的CreateObject函数来创建一个反射对象,然后使用它来访问PM317.dll中的类和成员。

https://wenku.baidu.com/view/e775d1cd1ae8b8f67c1cfad6195f312b3069eb4b.html?_wkts_=1676341369898&bdQuery=%E5%A6%82%E4%BD%95%E5%9C%A8.net%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%BC%80%E5%8F%91%E5%8F%AF%E4%BB%A5%E5%9C%A8VBA%E4%B8%AD%E5%BC%95%E7%94%A8%E7%9A%84%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93

在.NET环境中开发可以在VBA中引用的动态链接库可以使用Com Interop技术。这需要在.NET环境中创建一个类库项目,并在该项目中定义需要导出的类,然后将该项目编译为一个Com可见的类型库(即一个.tlb文件)。

具体步骤如下:
1、在Visual Studio中创建一个Class Library项目。
2、使用以下属性将该项目设置为Com可见:

  • 在项目属性中选择“应用程序”选项卡
  • 在“生成”选项卡中选择“注册为COM组件”选项

3、在项目中定义需要导出的类,并使用System.Runtime.InteropServices命名空间中的ComVisible属性标识该类是Com可见的。
4、编译项目,生成.tlb文件。
5、在VBA代码中引用该类型库,并使用CreateObject函数创建一个对象实例。
6、使用该对象实例调用项目中定义的方法,从而实现与.NET代码的交互。

希望这个方法能帮助您在.NET环境中开发可以在VBA中引用的动态链接库。

在vb.net当中定义一个接口,并定义这个接口的方法和属性,然和在vba当中creatObject一个对象,调用它的属性,即类的属性,并和vb.net定义的接口方法一致,这样可以调用vb.net 中对象并方法。

你这个看似是com组件,需要注册的。另外看是否还有依赖的动态库不能缺的。很简单的,如果真搞不定可以远程协助。

题主,这个问题我来替你解决,若有帮助,还望采纳,点击回答右侧采纳即可。

1.打开VBA编辑器,点"工具"菜单下的"引用"命令,在引用对话框中引用该动态链接库。
调用代码如下:

Dim VBACls As New VBAPrj.VBACls  
VBACls.Test(ThisDocument) 

2.如果知道该动态链接库文件的位置,可以在ThisDocument代码窗口以代码形式引用,
代码如下:

Private Sub Document_Open()
                   On Error
Resume Next
                   Me.VBProject.References.AddFromFile
"D:\VBAPrj.dll"
         End
Sub

3.将动态链接库文件拷贝到文档同一目录下,可在ThisDocument代码窗口中建立如下引用函数:

Private Function GetProjectDoc() As Object
                 On Error Resume
Next
                 Dim VBACls As Object
                 Set VBACls =
CreateObject("VBAPrj.VBACls")
                 If VBACls Is Nothing
Then
              MsgBox "VBAPrj.dll必须和文档在同一目录下!"
              Exit
Function
                End If
                Set GetProjectDoc =
VBACls
         End Function

然后以以下代码形式调用Test:

Dim
objPrjDoc As Object
         Set objPrjDoc = GetProjectDoc
         Call
objPrjDoc.Test(ThisDocument)
         Set objPrjDoc =
Nothing

=====
使用第一种方法调试提示找不到类库,第二种方法我没试过,用了第三种方法调试成功。我也觉得第三种还是蛮好的,除了多几行代码。成功调用DLL后原来很多在VB下写的东东简单改一下就可以在VBA下用了,效率又高,保密性又好

从您提供的信息看,可能出现问题的地方在于您在VBA中创建COM对象时的 ProgID 名称。在VB.net的例程中,对象创建的代码如下:

Dim Instrument As New PM317

其中 PM317 是 COM 对象的名称。而在您的 VBA 代码中,您创建 COM 对象的代码如下:

Dim InstrPM As Object
Set InstrPM = CreateObject("PM317")

其中 PM317 是 ProgID 名称,也就是 COM 对象在注册表中的名称。如果该名称不正确,那么 VBA 就无法正确创建该 COM 对象。

请尝试使用以下代码创建 COM 对象,看是否可以成功:

Dim InstrPM As Object
Set InstrPM = CreateObject("PM317.PM317")

其中 PM317.PM317 是 COM 对象的名称和命名空间。如果名称不正确,您可以尝试在命令行中执行 regedit 命令打开注册表,搜索 PM317,看是否可以找到正确的 ProgID。

可能是由于在 .NET 环境中生成的 DLL 文件不能直接在 VBA 中引用。要解决这个问题,可以通过以下步骤解决:

1.使用 Regasm.exe 工具注册 DLL 文件。这将生成一个 type library 文件,该文件定义了 DLL 中所有可供 VBA 调用的类型。
2.使用 Tlbexp.exe 工具生成类型库文件。
3.在 VBA 中引用生成的类型库文件。

具体的命令如下:

regasm PM317.dll /tlb:PM317.tlb
tlbexp PM317.dll /out:PM317.tlb

在执行这些命令之后,您可以再次在 VBA 中尝试引用生成的类型库文件,如果成功,则可以在 VBA 中看到控制仪器的所有可供调用的类型。