当前位置: 首页 > article >正文

使用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示例


http://www.kler.cn/a/415445.html

相关文章:

  • 前端导出文件,下载文件,downloadFile 方法汇总
  • Mybatis集成篇(一)
  • 华为海思2025届校招笔试面试经验分享
  • STL算法之基本算法<stl_algobase.h>
  • CAN详解
  • 以达梦为数据库底座时部署的微服务页面报乱码,调整兼容模式
  • c++趣味编程玩转物联网:树莓派Pico控制 LED点阵屏
  • 11.25.2024刷华为OD
  • 【动态规划】完全背包问题应用
  • 淘宝Vision Pro:革新购物体验的沉浸式未来
  • QML 之 画布元素学习
  • 51单片机从入门到精通:理论与实践指南常用资源篇(五)
  • 提升数据分析效率:Excel Power Query和Power Pivot的妙用
  • 获取字 short WORD 上指定的位是否有效
  • Stability AI最新一代图像生成模型stable-diffusion-3.5-large分享
  • 力扣题库Day4(持续更新中...)
  • AutoGLM的一小步,人机交互进化的一大步
  • 查看k8s集群中pod和node的资源使用情况
  • 基于stm32单片机的教室节能系统设计
  • C# 集合(Collection)
  • 从Facebook的技术演进看社交媒体的未来趋势
  • 【微服务】http客户端Feign
  • Redis中的分布式锁(步步为营)
  • MySQL单行函数
  • uniapp在App端引用echarts组件,解决无法渲染formatter问题
  • 阿里滑块v2,1.1.11新版,后面考虑上AI轨迹