VBA調用.NET生成的COMDLL庫

職場菊菊子 2024-03-20 06:56:24

.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 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

注冊DLL

還是在DLL所在目錄,注冊我們剛剛生成的DLL文件。

regasm /codebase VBADotNetLibrary.dll

在VBA中引用組件

在VBA編輯器中,點擊菜單 工具 -> 引用,在彈出對話框中選擇生成的tlb文件,完成組件引用。

調用DLL

參考以下方式,調用DLL中的方法。

Sub testDotNetDLL() Dim obj As New VBADotNetLibrary.Tools MsgBox obj.MD5("ok")End Sub
0 阅读:5

職場菊菊子

簡介:感謝大家的關注