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/
- Windows:
- 在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#里的对应声明:
注意:Android/iOS平台的库名要去掉前缀后缀,比如[DllImport("hoge", CallingConvention = CallingConvention.Cdecl)] public static extern int Add(int a, int b);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
相关产品推荐
相关产品推荐

