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
早期绑定(可选,更高效)
- 打开VBA编辑器→工具→引用→找到「helloworld」(编译时生成的TLB文件)并勾选
- 使用强类型调用:
Sub CallDLLEarlyBinding() Dim obj As helloworld.Class1 Set obj = New helloworld.Class1 MsgBox obj.GetMessage() End Sub
内容的提问来源于stack exchange,提问作者EXCUSEME
相关产品推荐
相关产品推荐

