使用Native AOT发布C# dll 提供给C++调用
Native AOT,即提前本地编译(Ahead-Of-Time Compilation),是一种将托管代码(如 C#)编译为本机可执行文件的技术,无需在运行时进行任何代码生成。
(Native AOT 优缺点截图摘自张善友博客)
使用Native AOT发布C# dll
创建 C# 项目并启用 Native AOT:
确保使用的是 .NET 6 或更高版本。
在 .csproj 文件中配置 Native AOT。
定义需要调用的方法,并使用 UnmanagedCallersOnly 属性导出这些方法。
using System.Runtime.InteropServices;
namespace AotDemo
{
public class Example
{
[UnmanagedCallersOnly(EntryPoint = "Add")]
public static int Add(int a, int b)
{
return a + b;
}
}
}
发布dll
.net8及以下暂不支持x86,官网上标注.net9支持
.net8输出x86如下错误提示
反编译Native AOT输出的dll,发现是可以防止反编译的
C++调用Native AOT输出的C# dll
创建C++控制台项目,代码如下
#include <iostream>
#include <Windows.h>
// 定义一个函数指针类型,指向接受两个整数参数并返回整数的函数
typedef int (*AddFunc)(int a, int b);
int main()
{
std::cout << "Hello World!\n";
// 载入名为 "AotDemo.dll" 的动态链接库,并返回库的句柄
HINSTANCE hInst = LoadLibrary(TEXT("AotDemo.dll"));
// 检查库是否成功加载
if (!hInst) {
// 输出错误信息到控制台
std::cerr << "Failed to load library\n";
return -1; // 退出程序并返回错误码
}
// 从动态链接库中获取名为 "Add" 的函数的地址
AddFunc Add = (AddFunc)GetProcAddress(hInst, "Add");
// 检查函数是否成功获取
if (!Add) {
// 输出错误信息到控制台
std::cerr << "Failed to find method\n";
return -1; // 退出程序并返回错误码
}
// 调用获取的函数,传入参数 3 和 4,接收返回值
int result = Add(3, 4);
// 输出函数返回结果到控制台
std::cout << "Result: " << result << std::endl;
// 释放加载的动态链接库
FreeLibrary(hInst);
}
控制台打印如下
demo示例