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

VBA调用C# DLL遇Error 453错误求助(64位环境)

解决VBA调用C# DLL时的Error 453问题

Error 453的核心原因是:你用Declare PtrSafe调用.NET托管DLL的方式错误——.NET类库是托管程序集,无法直接作为非托管Win32 DLL通过Declare语句调用,VBA找不到对应的非托管入口点才会抛出该错误。以下是正确的解决步骤:

1. 修改C#类库配置与代码

确保类库支持COM互操作,修改后的代码如下:

using System;
using System.Runtime.InteropServices;

namespace helloworld
{
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class Class1
    {
        public string GetMessage()
        {
            return "Hello, World!";
        }
    }
}
  • [ComVisible(true)]:确保类和方法对COM可见
  • [ClassInterface(ClassInterfaceType.AutoDual)]:自动生成COM接口,让VBA能识别类的方法

2. 编译并注册COM互操作

  • 编译时确认项目目标平台为x64(和你的64位Excel匹配),目标框架保持.NET Framework 4.5
  • 注册DLL到COM:
    • 方法一(Visual Studio开发环境):右键项目→属性→生成→勾选「为COM互操作注册」(需管理员权限),重新编译
    • 方法二(手动注册):打开64位命令提示符(管理员),执行以下命令:
      C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe "C:\Users\Documents\Visual Studio 2015\Projects\helloworld\helloworld\bin\x64\Debug\helloworld.dll" /codebase
      

3. 修改VBA代码调用COM对象

不再使用Declare语句,而是通过COM实例调用方法:

晚期绑定(无需引用TLB)

Sub CallDLL()
    Dim obj As Object
    Set obj = CreateObject("helloworld.Class1")
    MsgBox obj.GetMessage()
End Sub

早期绑定(可选,更高效)

  1. 打开VBA编辑器→工具→引用→找到「helloworld」(编译时生成的TLB文件)并勾选
  2. 使用强类型调用:
Sub CallDLLEarlyBinding()
    Dim obj As helloworld.Class1
    Set obj = New helloworld.Class1
    MsgBox obj.GetMessage()
End Sub

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 11:02:31