如何通过VBA的Declare语句调用C#开发的.dll类库?
问题原因与解决方案
你遇到的核心问题是:C#编写的是托管.NET程序集,而VBA的Declare语句仅支持直接调用非托管Win32 DLL(如C/C++编译的原生DLL),直接加载会因为托管/非托管的运行环境差异导致失败。
以下是具体解决步骤:
1. 改造C#类库,导出非托管函数
需要借助UnmanagedExports NuGet包(作者Robert Giesecke),将.NET方法导出为非托管函数,让VBA的Declare可以识别。
步骤细节:
- 打开你的C#类库项目,安装NuGet包
UnmanagedExports - 修改C#代码,将
Add方法改为静态方法,并添加[DllExport]属性指定导出配置:
using RGiesecke.DllExport; using System.Runtime.InteropServices; namespace Calculator { public class BasicCalculator { // 导出为非托管函数,指定函数名和调用约定 [DllExport("Add", CallingConvention = CallingConvention.StdCall)] public static int Add(int number1, int number2) { return number1 + number2; } } }
- 编译时注意:项目平台需与你的Office版本匹配(32位Office选x86,64位选x64),否则会出现加载失败。
2. 调整VBA代码适配类型与位数
注意C#的int是32位整数,对应VBA的Long(而非VBA的16位Integer),同时确保位数适配:
Option Explicit #If VBA7 Then Public Declare PtrSafe Function Add Lib "C:\Calculator\Calculator.dll" (ByVal number1 As Long, ByVal number2 As Long) As Long #Else Public Declare Function Add Lib "C:\Calculator\Calculator.dll" (ByVal number1 As Long, ByVal number2 As Long) As Long #End If Sub Calculate() Dim n1 As Long Dim n2 As Long Dim result As Long n1 = 20 n2 = 10 result = Add(n1, n2) Debug.Print result End Sub
替代方案(无需第三方包)
如果不想用UnmanagedExports,可以用C++/CLI编写中间层DLL:
- 创建C++/CLI类库,引用你的C#程序集
- 在C++/CLI中编写非托管导出函数,内部调用C#类的方法
- VBA通过
Declare调用C++/CLI导出的函数
这种方式步骤更繁琐,适合对第三方包有顾虑的场景。
内容的提问来源于stack exchange,提问作者Simant
相关产品推荐
相关产品推荐

