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

MAUI项目调用C++函数失败,求正确实现方案

MAUI项目调用C++共享库的正确步骤

1. 匹配库与MAUI的目标架构

MAUI是跨平台框架,默认会针对多架构编译(如x64、arm64),你的C++库必须和MAUI项目的目标架构完全一致,不能混用x86和x64、arm32和arm64。

  • 在CMake里指定目标架构:
    set(CMAKE_SYSTEM_PROCESSOR x64) # 按需改成arm64等MAUI目标架构
    

2. 手动配置库的部署规则

控制台应用会自动复制依赖库,但MAUI得手动配置,确保库能被打包到应用里:

  • 把编译好的C++库放到MAUI项目对应平台的目录:
    • Windows:Platforms/Windows/
    • Android:Platforms/Android/libs/<架构>/(比如arm64-v8a)
    • iOS/macOS:Platforms/iOS/ 或 Platforms/MacCatalyst/
  • 在MAUI的.csproj文件里加配置,保证库被复制到输出目录:
    <!-- Windows示例 -->
    <ItemGroup>
      <None Include="Platforms/Windows/hoge.dll">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
      </None>
    </ItemGroup>
    
    <!-- Android示例 -->
    <ItemGroup>
      <AndroidNativeLibrary Include="Platforms/Android/libs/arm64-v8a/libhoge.so">
        <Abi>arm64-v8a</Abi>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </AndroidNativeLibrary>
    </ItemGroup>
    

3. 保证P/Invoke声明完全匹配

C#里的P/Invoke声明必须和C++函数的签名丝毫不差,包括函数名、参数、返回值、调用约定:

  • C++函数(hoge.h)要加extern "C"防止名字篡改:
    extern "C" __declspec(dllexport) int Add(int a, int b);
    
  • C#里的对应声明:
    [DllImport("hoge", CallingConvention = CallingConvention.Cdecl)]
    public static extern int Add(int a, int b);
    
    注意:Android/iOS平台的库名要去掉前缀后缀,比如libhoge.so直接写"hoge"。

4. 处理运行时加载路径问题

MAUI的运行工作目录和控制台不同,可能导致库找不到:

  • Windows上可以手动指定加载路径:
    var libraryPath = Path.Combine(AppContext.BaseDirectory, "hoge.dll");
    NativeLibrary.Load(libraryPath);
    
  • Android上只要把库放到正确的libs/<架构>目录,MAUI会自动加载对应ABI的库。

5. 排查运行时错误

如果还是跑不起来,打开MAUI的调试输出,看具体报错(比如DllNotFoundException):

  • 检查库是否真的被复制到了输出目录的对应平台文件夹。
  • 用dumpbin(Windows)等工具查看C++库的导出函数,确认函数名没被编译器篡改(必须有extern "C")。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:16:04