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

根据操作系统位数声明外部函数代码失效求助

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:14:57