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

解决MS Access调用x64 .NET DLL时‘找不到DLL入口点’问题

解决Access x64调用.NET Framework类库时“找不到DLL入口点”的问题

问题场景

基于.NET Framework 4.7.2开发的x64类库,需在Office365的MS Access x64环境中调用。Access类模块中使用以下代码引用并加载DLL:

VBA声明代码

Private Declare PtrSafe Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As LongPtr
Private Declare PtrSafe Function FreeLibrary Lib "kernel32" (ByVal hLibModule As LongPtr) As Long
Private Declare PtrSafe Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal GetModuleHandle As String) As LongPtr
Private Declare PtrSafe Function myFunction Lib "Path\To\dll.dll" () As Object

VBA调用逻辑

Private Function DM() As Object
    On Error Resume Next
    If dmObject Is Nothing Then
        'load from the dll
        hLibModuleID = LoadLibrary("Path\to\dll.dll")
        'Debug.Print hLibModuleID
        
        Set dmObject = myFunction()
        'Debug.Print dmObject
    End If
    
    Set DM = dmObject
End Function

执行Set dmObject = myFunction()时,函数返回Nothing,且抛出“找不到DLL入口点”错误。已确认DLL为x64编译,安装了UnmanagedExports NuGet包并使用using RGiescke.DllExport;和[DllExport]属性,项目采用PackageReference管理NuGet包。

解决步骤

  • 检查导出函数的实际名称
    .NET方法导出到非托管DLL时,可能会被C++名称修饰改变入口点名称。使用VS开发命令提示符执行dumpbin /exports Path\To\dll.dll,查看DLL实际导出的函数名。如果名称不是myFunction,需在VBA声明中通过Alias指定正确名称,示例:

    Private Declare PtrSafe Function myFunction Lib "Path\To\dll.dll" Alias "_myFunction@0" () As Object
    

    或在.NET代码中显式指定导出名称,避免修饰:

    [DllExport("myFunction", CallingConvention = CallingConvention.StdCall)]
    public static object myFunction()
    {
        // 方法实现
    }
    
  • 确保调用约定匹配
    VBA的Declare语句默认使用StdCall调用约定,.NET导出代码必须显式指定相同约定,否则会导致入口点匹配失败。

  • 验证DLL加载状态与依赖

    1. 检查LoadLibrary返回的hLibModuleID,若为0则说明DLL加载失败。可能是路径错误或依赖缺失,用x64版本的Dependency Walker检查DLL的依赖项是否齐全。
    2. 使用绝对路径指定DLL位置,或确保DLL在Access的搜索路径中(如当前数据库目录、系统目录)。
  • 确认返回类型的COM兼容性
    VBA的Object类型要求返回的.NET对象具备COM可见性:

    • 在自定义类上添加[ComVisible(true)]属性;
    • 避免返回.NET特有的非COM兼容类型,优先使用string、int等基础类型或标记了ComVisible的自定义类型。
  • 清理并重新生成项目
    若NuGet配置未正确生效,执行以下操作:

    1. 卸载并重新安装UnmanagedExports包;
    2. 清理项目后重新生成x64版本的DLL;
    3. 确认输出的DLL为最新编译版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:52:51