You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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:

  1. 创建C++/CLI类库,引用你的C#程序集
  2. 在C++/CLI中编写非托管导出函数,内部调用C#类的方法
  3. VBA通过Declare调用C++/CLI导出的函数

这种方式步骤更繁琐,适合对第三方包有顾虑的场景。

内容的提问来源于stack exchange,提问作者Simant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:25:24