分享

VBA调用.NET生成的COM DLL库

 剩矿空钱 2024-04-26 发布于湖北

.NET功能强大,众所周知。在VBA中,也可以调用.NET中编写的DLL动态链接库,丰富VBA的不足之处。

在VBA中调用.NET编写的DLL(动态链接库)通常涉及使用COM Interop(组件对象模型互操作性)来桥接VBA和.NET之间的鸿沟。这通常意味着你需要将.NET DLL公开为COM可见的对象,以便VBA能够与之交互。

以下是一个概述性的步骤,用于在VBA中调用.NET DLL:

1. 编写.NET DLL

首先,你需要有一个.NET DLL,它包含你想要在VBA中使用的功能。确保这些功能通过公共接口(如类或接口)暴露出来。

2. 使.NET DLL COM可见

要使.NET DLL能够被VBA访问,你需要使用特定的属性来标记你想要公开的类和方法。这通常涉及使用[ComVisible(true)]和[Guid('...')]等属性。

3. 生成类型库(.tlb文件)

一旦你的.NET DLL是COM可见的,你可以使用tlbexp.exe工具(它是.NET Framework的一部分)来生成一个类型库(.tlb文件)。这个类型库描述了DLL中公开的COM类型和接口,VBA将使用它来理解如何与DLL交互。

4. 在VBA中引用DLL

在VBA编辑器中,通过“工具”>“引用”来添加对刚才生成的.tlb文件的引用。一旦添加了引用,你就可以在VBA代码中创建和使用DLL中公开的对象了。

5. 调用DLL中的方法

一旦你在VBA中添加了对DLL的引用,你就可以像使用其他VBA对象一样使用它。你可以创建DLL中公开类的实例,并调用其方法。

注意事项:

  • 确保.NET DLL是针对与VBA兼容的.NET Framework版本编译的。例如,如果你的Office版本是基于较旧的.NET Framework版本,那么你的DLL也需要使用相同的版本进行编译。
  • COM Interop可能会引入一些性能开销,特别是当在VBA和.NET之间传递大量数据时。因此,在设计接口时要考虑性能因素。
  • 处理错误和异常也很重要。你需要确保.NET代码能够适当地处理错误,并将必要的信息返回给VBA以便进行适当的错误处理。

接下来按照上述步骤创建一个完整的库用来在VBA调用。

在Visual Studio创建DLL

该DLL对外提供MD5函数,弥补VBA没有MD5函数的不足。

DLL名:VBADotNetLibrary.dll

Class名:Tools

方法名:MD5

参考代码如下。需要在visual studio中输入该代码,然后编译成DLL。

using System;using System.Runtime.InteropServices;using System.Security.Cryptography;using System.Text;/** * 1, 在Visual Studio开始菜单中找到 Developer Command Prompt for VS 2022 * 2, 切换到dll目录 * 3, 根据dll生成对应的tlb。tlbexp xx.dll * 4, 注册dll。regasm /codebase xx.dll * 5, 在vba中浏览并引用对应的tlb文件 * */namespace VBADotNetLibrary{ [ComVisible(true)] [Guid('E5C41D4C-C874-418A-8A3F-04FD183B7596')] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IMyInterface { [ComVisible(true)] string md5(string name); } [ComVisible(true)] [Guid('591BF508-A3F1-4C89-990B-A00A164820A0')] [ClassInterface(ClassInterfaceType.None)] public class Tools:IMyInterface { /// <summary> /// MD5函数 /// </summary> /// <param name='src'>待MD5编码文本</param> /// <returns></returns> public string md5(string src) { // 创建一个MD5CryptoServiceProvider对象 using (MD5 md5Hash = MD5.Create()) { // 将输入字符串转换为字节数组 byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(src)); // 创建一个StringBuilder对象来收集字节并创建字符串 StringBuilder sBuilder = new StringBuilder(); // 遍历数据中的每个字节并格式化为十六进制字符串 for (int i = 0; i < data.Length; i ) { sBuilder.Append(data[i].ToString('x2')); } // 返回十六进制字符串 return sBuilder.ToString(); } } }}

生成tlb格式组件

在Visual Studio开始菜单中找到 Developer Command Prompt for VS 2022,或者其他版本,用管理员权限运行。切换到生成好的DLL文件所在目录,运行tlbexp命令,生成tlb文件。DLL名字换成自己库的名字。

tlbexp VBADotNetLibrary.dll
VBA调用.NET生成的COM DLL库

注册DLL

还是在DLL所在目录,注册我们刚刚生成的DLL文件。

regasm /codebase VBADotNetLibrary.dll
VBA调用.NET生成的COM DLL库

在VBA中引用组件

在VBA编辑器中,点击菜单 工具 -> 引用,在弹出对话框中选择生成的tlb文件,完成组件引用。

VBA调用.NET生成的COM DLL库

调用DLL

参考以下方式,调用DLL中的方法。

Sub testDotNetDLL()    Dim obj As New VBADotNetLibrary.Tools    MsgBox obj.MD5('ok')End Sub

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多