VS2019加载C编写的32位非托管DLL报错,求解决(Win10 64位)
解决32位swedll32.dll在64位系统下的加载失败问题
我之前处理过类似的32位原生DLL在64位Windows环境下的加载问题,结合你描述的情况,给你几个具体的排查和解决方向:
确认DLL的放置位置是否正确
当你把项目编译目标改为X86后,程序会以32位模式运行,此时它会优先在以下位置查找32位DLL:- 程序的输出目录(比如
bin\x86\Debug或bin\x86\Release)的根目录 - 系统的
SysWOW64文件夹(64位系统中专门存放32位系统DLL的目录,不要放到System32,那是64位DLL的目录)
你可以用Process Monitor工具跟踪程序加载DLL的行为,看看它实际在哪些路径下查找swedll32.dll,确认是否存在路径不匹配的问题。
- 程序的输出目录(比如
检查DLL的依赖项是否完整
32位的swedll32.dll可能依赖其他32位的运行库(比如老版本的MSVC运行库),你可以用32位版本的Dependency Walker打开这个DLL,查看是否有缺失的依赖项。如果发现有缺失,需要安装对应的32位运行库包。修正DLL导入的声明方式
你当前使用的Declare语句在VB.NET中属于较旧的语法,推荐使用更灵活的DllImport属性,同时确保函数名、调用约定完全匹配:Imports System.Runtime.InteropServices Public Class Form1 <DllImport("swedll32.dll", EntryPoint:="_swe_set_ephe_path@4", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Ansi)> Public Shared Sub swe_set_ephe_path(ByVal path As String) End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load swe_set_ephe_path(System.IO.Path.Combine(System.IO.Path.GetDirectoryName(Application.ExecutablePath), "SwEph")) End Sub End Class另外,你可以用VS自带的
dumpbin工具(打开Developer Command Prompt for VS2019)执行以下命令,确认DLL导出的函数名是否和你使用的Alias一致:dumpbin /exports swedll32.dll验证DLL文件本身是否完好
有时候下载的DLL可能损坏,或者被杀毒软件误拦截。建议重新从官方渠道获取32位版本的swedll32.dll,替换到正确位置后,暂时关闭杀毒软件再测试。尝试兼容性模式运行
如果以上方法都无效,可能是DLL本身和Win10存在兼容性问题。你可以右键生成的32位EXE文件,选择属性→兼容性,勾选“以兼容模式运行这个程序”,并选择Windows XP SP3或Windows 7,再运行测试。
内容的提问来源于stack exchange,提问作者user12647598
相关产品推荐
相关产品推荐

