C# NativeAOT生成.so 库供Linux下C++调用

C# NativeAOT生成.so 库供Linux下C++调用

#nativeAOT

✅ 最终目标

使用 C# 编写 Add(int a, int b) → 编译为 libadd.so → 在 Linux C++ 中通过 dlopen + dlsym 调用


🧱 第 1 步:创建 NativeAOT 项目

复制代码
xxxxxxxxxx
复制代码
dotnet new classlib -n AddLibrary
复制代码
cd AddLibrary

📄 修改 AddLibrary.csproj

编辑 AddLibrary.csproj 文件,设置为使用 NativeAOT 编译:

复制代码
xxxxxxxxxx
复制代码
<Project Sdk="Microsoft.NET.Sdk">
复制代码
  <PropertyGroup>
复制代码
    <OutputType>Library</OutputType>
复制代码
    <TargetFramework>net8.0</TargetFramework>
复制代码
    <PublishAot>true</PublishAot>
复制代码
    <SelfContained>true</SelfContained>
复制代码
    <UseNativeAot>true</UseNativeAot>
复制代码
  </PropertyGroup>
复制代码
</Project>

🧠 第 2 步:编写导出函数(Add)

创建或替换 Class1.cs 文件内容如下:
x

复制代码
using System;
复制代码
using System.Runtime.InteropServices;
复制代码
复制代码
public static class Exports
复制代码
{
复制代码
    [UnmanagedCallersOnly(EntryPoint = "Add")]
复制代码
    public static int Add(int a, int b)
复制代码
    {
复制代码
        return a + b;
复制代码
    }
复制代码
}

🛠 第 3 步:在 Linux 或 WSL 中发布为 .so(WSL为例)

🛠️ 安装WSL

复制代码
xxxxxxxxxx
复制代码
wsl --install

🛠️WSL下安装配置dotnet库

复制代码
xxxxxxxxxx
复制代码
wget https://dotnet.microsoft.com/download/dotnet/scripts/v1/dotnet-install.sh
复制代码
chmod +x dotnet-install.sh
复制代码
./dotnet-install.sh --version 8.0.204

🛠️配置环境变量

你只需在终端执行(或添加到 ~/.bashrc / ~/.zshrc):

复制代码
xxxxxxxxxx
复制代码
export DOTNET_ROOT=$HOME/.dotnet export PATH=$PATH:$HOME/.dotnet:$HOME/.dotnet/tools

然后运行:

复制代码
xxxxxxxxxx
复制代码
source ~/.bashrc  # 或 ~/.zshrc,如果你用的是 zsh

确认安装成功:

复制代码
xxxxxxxxxx
复制代码
dotnet --version

✅ 输出 8.0.204 即成功!

🛠️安装构建环境

复制代码
xxxxxxxxxx
复制代码
sudo apt update
复制代码
sudo apt install -y build-essential clang zlib1g-dev

解释:

  • ✅ build-essential:包含 gcc, g++, make, ld 等工具
  • ✅ clang:LLVM 链接器(NativeAOT 优先使用)
  • ✅ zlib1g-dev:NativeAOT 部分场景下需要

验证是否安装成功

复制代码
xxxxxxxxxx
复制代码
gcc --version
复制代码
clang --version

你 必须在 Linux 或 WSL 环境下 执行: 示例:项目位于 d:/Work/Test/NativeAOT/ULib

复制代码
xxxxxxxxxx
复制代码
cd /mnt/d/Work/Test/NativeAOT/ULib
复制代码
dotnet publish -c Release -r linux-x64

输出文件位于:

复制代码
xxxxxxxxxx
复制代码
bin/Release/net8.0/linux-x64/native/AddLibrary.so

可重命名为:

复制代码
xxxxxxxxxx
复制代码
cp bin/Release/net8.0/linux-x64/native/AddLibrary.so ./libadd.so

✅ 第 4 步:用 C++ 调用 libadd.so

创建一个 main.cpp:

复制代码
xxxxxxxxxx
复制代码
#include <iostream>
复制代码
#include <dlfcn.h>
复制代码
复制代码
typedef int (*AddFunc)(int, int);
复制代码
复制代码
int main() {
复制代码
    //加载当前目录下的libadd.so
复制代码
    void* handle = dlopen("./libadd.so", RTLD_NOW);
复制代码
    if (!handle) {
复制代码
        std::cerr << "Failed to load .so: " << dlerror() << std::endl;
复制代码
        return 1;
复制代码
    }
复制代码
复制代码
    AddFunc add = (AddFunc)dlsym(handle, "Add");
复制代码
    if (!add) {
复制代码
        std::cerr << "Failed to find symbol: " << dlerror() << std::endl;
复制代码
        dlclose(handle);
复制代码
        return 2;
复制代码
    }
复制代码
复制代码
    int result = add(10, 20);
复制代码
    std::cout << "✅ Add(10, 20) = " << result << std::endl;
复制代码
复制代码
    dlclose(handle);
复制代码
    return 0;
复制代码
}

🧪 第 5 步:编译并运行 C++ 调用测试

确保在main.cpp 和libadd.so 所在的目录中运行

复制代码
xxxxxxxxxx
复制代码
g++ main.cpp -o testadd -ldl
复制代码
./testadd

输出:

复制代码
xxxxxxxxxx
复制代码
✅ Add(10, 20) = 30

📦 最终结构示意

复制代码
xxxxxxxxxx
复制代码
AddLibrary/
复制代码
├── AddLibrary.csproj
复制代码
├── Class1.cs  (含 Add 方法)
复制代码
├── bin/
复制代码
│   └── Release/...
复制代码
├── libadd.so  <-- 编译后复制出来
复制代码
└── main.cpp   <-- 调用测试

✅ 额外建议

目标 操作
自动编译 .so + 测试 写 build.sh 脚本
发布 Windows .dll -r win-x64
多函数导出 增加多个 [UnmanagedCallersOnly(EntryPoint = "...")]
高性能 避免复杂对象,使用基本类型指针(int, float*)

✅ 总结命令回顾

复制代码
dotnet new classlib -n AddLibrary
复制代码
# 编辑代码 & csproj
复制代码
dotnet publish -c Release -r linux-x64
复制代码
g++ main.cpp -o testadd -ldl
复制代码
./testadd
相关推荐
波力海苔夹心脆6753 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
昂好的day5 小时前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
小羊没烦恼!10 小时前
深入浅出SQL Server中的死锁
java·开发语言·前端·数据库·后端·spring·c#
czhc114007566318 小时前
同值短路与单一真值源:属性不是命令,状态只有一个家
c#
下页、再停留1 天前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
波力海苔夹心脆6751 天前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
小羊没烦恼!1 天前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
淡海水1 天前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维1 天前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
半摆烂日常1 天前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#