根据操作系统位数声明外部函数代码失效求助
解决VB.NET根据系统位数动态声明DLL函数的问题
你的代码无法运行的核心原因是混淆了编译时常量和运行时变量:
#Const WIN64 = isOp64Bit这里的#Const是编译时定义的常量,而Environment.Is64BitOperatingSystem是程序运行时才能获取的系统信息——编译阶段这个变量还没有值,所以你的条件编译完全不起作用,自然无法正确加载对应的DLL。
下面给你两种可行的解决方案,根据你的项目需求选择:
方案一:利用项目平台的内置条件编译常量(推荐)
VB.NET项目本身会根据你设置的目标平台自动定义对应的编译常量,直接用这个特性最省心:
#If WIN64 Then ' 编译x64版本时,自动引用64位DLL Declare Function Init_MatrixAPI Lib "matrix64.dll" () As Short #Else ' 编译x86版本时,自动引用32位DLL Declare Function Init_MatrixAPI Lib "matrix32.dll" () As Short #End If
操作步骤:
- 右键项目 → 属性 → 编译 → 目标平台,选择
x86或x64; - 编译对应版本的程序,它会自动加载匹配位数的DLL;
- 这种方式编译出来的程序体积更小,也避免了运行时判断的开销。
方案二:运行时动态加载(适合Any CPU场景)
如果你的项目必须设置为Any CPU,需要在运行时根据系统位数动态切换DLL,可以用DllImport的Condition属性配合封装方法:
Imports System.Runtime.InteropServices Public Class MatrixAPIWrapper ' 仅在编译x64版本时导入64位DLL函数 <DllImport("matrix64.dll", EntryPoint:="Init_MatrixAPI", Condition:="WIN64")> Private Shared Function Init_MatrixAPI64() As Short End Function ' 仅在编译x86版本时导入32位DLL函数 <DllImport("matrix32.dll", EntryPoint:="Init_MatrixAPI", Condition:="Not WIN64")> Private Shared Function Init_MatrixAPI32() As Short End Function ' 对外提供统一的调用入口,运行时判断系统位数 Public Shared Function Init_MatrixAPI() As Short Return If(Environment.Is64BitOperatingSystem, Init_MatrixAPI64(), Init_MatrixAPI32()) End Function End Class
注意事项:
- 确保
matrix64.dll和matrix32.dll都放在程序的运行目录下; .NET Framework 4.5+及.NET Core/.NET 5+都支持Condition属性;- 如果是.NET Core/.NET 5+,也可以用
RuntimeInformation.ProcessArchitecture来更精准判断运行时架构(比如ProcessArchitecture.X64)。
内容的提问来源于stack exchange,提问作者salvatore100
相关产品推荐
相关产品推荐

