使用AoT让.NetFramework4.7.2程序调用.Net8编写的库

news2025/4/21 16:50:50

1、创建.Net8的库,双击解决方案中的项目,修改如下,启用AoT:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Library</OutputType>
    <PublishAot>true</PublishAot>
    <IsAotCompatible>true</IsAotCompatible>
    <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

在Class1.cs文件中加入如下代码:

using System.Runtime.InteropServices;

namespace AoT001
{
    public class Export
    {
        [UnmanagedCallersOnly(EntryPoint = "Add")]
        public static int Add(int a, int b)
        {
            return a + b;
        }

        [UnmanagedCallersOnly(EntryPoint = "Combine")]
        public static IntPtr Combine(IntPtr str, int num)
        {
            var name = nameof(Export);
            string? inputStr = Marshal.PtrToStringAnsi(str);
            string? result = $"{inputStr} -- {num} -- {name}";
            return Marshal.StringToHGlobalAnsi(result);
        }

        [UnmanagedCallersOnly(EntryPoint = "Free")]
        public static void Free(IntPtr ptr) 
        {
            Marshal.FreeHGlobal(ptr);
        }
    }
}

右键,AoT库项目, 发布,弹出如下图,按步骤配置:

注意:AoT仅支持win-x64

点击发布后,启动编译过程,结果如下图:

如图,简单的dll编译后size是1.3M,因为AoT将所有的依赖库都打包到了DLL内,没有C#运行环境也可以执行。使用Dependence查看如下图:

可见AoT编译的dll已经和C或C++编译的dll兼容。在Framework4.7.2项目中可按普通C编译的dll使用,如下:

namespace Winform472
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            var sum = AoTHelp.Add(1111, 1112);
            var str1 = "Hello World 0001";
            var ptr1 = Marshal.StringToHGlobalAnsi(str1);
            var ptr2 = AoTHelp.Combine(ptr1, 500);
            var str2 = Marshal.PtrToStringAnsi(ptr2);
            AoTHelp.Free(ptr2);
            MessageBox.Show($"Hello, World! {sum}  {str2}");
        }
    }


    public static class AoTHelp
    {
        [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern int Add(int a, int b);

        [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern IntPtr Combine(IntPtr str, int sum);

        [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern void Free(IntPtr ptr);
    }
}

点击按钮界面如下:

在AoT库中引入MathNet.Numerics库,测试使用三方库后AoT创建dll的情况,新增函数:

        [UnmanagedCallersOnly(EntryPoint = "UseThirdLibTest")]
        public static bool UseThirdLibTest(int a, int b)
        {
            var D = Matrix<double>.Build.Dense(2, 9, 1);
            Console.WriteLine(D);
            return MathNet.Numerics.Control.Equals(a, b);
        }

重新发布后dll拷贝到调用项目的debug子命令,dll大下从1.3M变为1.8M。调用代码如下:

        [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern bool UseThirdLibTest(int a, int b);


        private void button2_Click(object sender, EventArgs e)
        {
            var res = AoTHelp.UseThirdLibTest(100, 100);
            MessageBox.Show(res.ToString());
        }

AoT库中传递结构体,AoT定义及调用分别如下:

    [StructLayout(LayoutKind.Sequential, Pack = 8)]
    public struct ParamStruct
    {
        public Int32 ResFlag;
        public UInt32 a;
        public UInt32 b;
        public UInt32 c;
    }

        [UnmanagedCallersOnly(EntryPoint = "GetValueFromAoT")]
        public static ParamStruct GetValueFromAoT(int initValue, ParamStruct param)
        {
            var result = new ParamStruct();
            if (initValue < 0)
            {
                result.ResFlag = -1;
                return result;
            }
            result.ResFlag = 0;
            result.a = param.a + (UInt32)initValue;
            result.b = param.b + (UInt32)initValue * 2;
            result.c = param.c + (UInt32)initValue * 3;
            return result;
        }

    [StructLayout(LayoutKind.Sequential, Pack = 8)]
    public struct ParamStruct
    {
        public Int32 ResFlag;
        public UInt32 a;
        public UInt32 b;
        public UInt32 c;
    }
    public static class AoTHelp
    {
        [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
        public static extern ParamStruct GetValueFromAoT(int initValue, ParamStruct param);
    }



            var param = new ParamStruct { a = 10, b = 20, c = 30};
            var param2 = AoTHelp.GetValueFromAoT(100, param);
            MessageBox.Show(param2.ToString());

注:结构体定义内如含bool运行时报错、含数组编译报错,简单的数值类型是ok的。如需要传递字符串,可使用IntPtr来实现。

.Net8的AoT不支持和Ui相关的内容调用,如在库内函数使用Form或MessageBox,看网上介绍.Net9已经支持,有待测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2308512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity

#知识点 1、安全开发-JavaEE-开发框架-SpringBoot&路由&传参 2、安全开发-JavaEE-模版引擎-Thymeleaf&Freemarker&Velocity 一、开发框架-SpringBoot 参考&#xff1a;https://springdoc.cn/spring-boot/ 访问SpringBoot创建的网站 1、路由映射 RequestMapping…

数据集笔记:NUSMods API

1 介绍 NUSMods API 包含用于渲染 NUSMods 的数据。这些数据包括新加坡国立大学&#xff08;NUS&#xff09;提供的课程以及课程表的信息&#xff0c;还包括上课地点的详细信息。 可以使用并实验这些数据&#xff0c;它们是从教务处提供的官方 API 中提取的。 该 API 由静态的…

SpringBoot新闻推荐系统设计与实现

随着信息时代的快速发展&#xff0c;新闻推荐系统成为用户获取个性化内容的重要工具。本文将介绍一个幽络源的基于SpringBoot开发的新闻推荐系统&#xff0c;该系统功能全面&#xff0c;操作简便&#xff0c;能够满足管理员和用户的多种需求。 管理员模块 管理员模块为系统管…

谷歌推出PaliGemma 2 mix:用于多任务的视觉语言模型,开箱即用。

去年 12 月&#xff0c;谷歌推出了 PaliGemma 2 &#xff0c;这是Gemma系列中的升级版视觉语言模型。该版本包含不同大小&#xff08;3B、10B 和 28B 参数&#xff09;的预训练检查点&#xff0c;可轻松针对各种视觉语言任务和领域进行微调&#xff0c;例如图像分割、短视频字幕…

linux中断调用流程(arm)

文章目录 ARM架构下Linux中断处理全流程解析&#xff1a;从硬件触发到驱动调用 ⚡**一、中断触发与硬件层响应** &#x1f50c;**1. 设备触发中断** &#x1f4e1; **二、CPU阶段&#xff1a;异常入口与上下文处理** &#x1f5a5;️**1. 异常模式切换** &#x1f504;**2. 跳转…

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 设置步骤&#xff1a; 在Functions函…

【算法】图论 —— Floyd算法 python

洛谷 B3647 【模板】Floyd 题目描述 给出一张由 n n n 个点 m m m 条边组成的无向图。 求出所有点对 ( i , j ) (i,j) (i,j) 之间的最短路径。 输入格式 第一行为两个整数 n , m n,m n,m&#xff0c;分别代表点的个数和边的条数。 接下来 m m m 行&#xff0c;每行三…

Windows 11【1001问】查看Windows 11 版本的18种方法

随着技术的飞速发展&#xff0c;操作系统作为连接硬件与软件的核心桥梁&#xff0c;其版本管理和更新变得尤为重要。对于用户而言&#xff0c;了解自己设备上运行的具体Windows 11版本不仅有助于优化系统性能&#xff0c;还能确保安全性和兼容性。然而&#xff0c;不同场景和需…

(视频教程)Compass代谢分析详细流程及python版-R语言版下游分析和可视化

不想做太多的前情解说了&#xff0c;有点累了&#xff0c;做了很久的内容&#xff0c;包括整个分析&#xff0c;从软件安装和报错解决到后期下游python版-R语言版下游分析和可视化&#xff01;单细胞代谢分析我们写过很多了&#xff0c;唯独少了最“高级”的compass&#xff0c…

文件描述符与重定向

1. open系统调用 在 Linux 中, open() 系统调用用于打开一个文件或设备&#xff0c;并返回一个文件描述符&#xff0c;通过该描述符可以进行文件读写操作。open() 可以用于创建新文件或打开已存在的文件&#xff0c;具体行为取决于传递给它的参数。 需要包含的头文件&#xf…

基于fast-whisper模型的语音识别工具的设计与实现

目录 摘 要 第1章 绪 论 1.1 论文研究主要内容 1.1.1模型类型选择 1.1.2开发语言的选择 1.2 国内外现状 第2章 关键技术介绍 2.1 关键性开发技术的介绍 2.1.1 Faster-Whisper数据模型 2.1.2 Django 第3章 系统分析 3.1 构架概述 3.1.1 功能构架 3.1.2 模块需求描述 3.2 系统开…

场内、场外期权怎么开户?期权佣金是多少?

期权交易需要一定的知识和经验&#xff0c;以有效管理风险和制定策略。 场内期权开户&#xff08;以50ETF为例&#xff09; 场内期权开户的各种方式大差不差&#xff0c;咱们就先以50ETF期权为例子看下。 场内期权开户条件包括&#xff1a; 首先是资金的要求&#xff0c;50万…

Linux:进程概念

目录 1 冯诺依曼体系 2 操作系统(Operator System) 3 如何理解管理 3.1计算机管理硬件 3.2 管理逻辑图 3.3 怎样管理 4 什么是进程&#xff1f; 5 查看进程 5.1 ps ajx显示所有进程信息 5.2 /proc(内存文件系统) 5.2.1 ls /proc/PID 5.2.2 ls /proc/PID -al ​ 5…

Rabbit MQ 高频面试题【刷题系列】

文章目录 一、公司生产环境用的什么消息中间件&#xff1f;二、Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点&#xff1f;三、解耦、异步、削峰是什么&#xff1f;四、消息队列有什么缺点&#xff1f;五、RabbitMQ一般用在什么场景&#xff1f;六、简单说RabbitMQ有哪些角…

【NLP 28、一文速通NLP文本分类任务 —— 深度学习】

目录 一、深度学习 — pipeline 流水线 1.配置文件 config.py Ⅰ、路径相关 Ⅱ、模型相关 Ⅲ、训练相关 2.数据加载 loader.py Ⅰ、类初始化 Ⅱ、加载数据并预处理 Ⅲ、文本编码 Ⅳ、对输入序列截断或填充 Ⅴ、返回数据长度 Ⅵ、返回对应索引位置元素 Ⅶ、加载词表 Ⅷ、封装数据…

UnrealEngine UE5 可视化 从地球观察火星 金星 土星 运动轨迹

视频参考&#xff1a;https://www.bilibili.com/video/BV1KpXSYdEdo/ 从地球观察土星的运动轨迹 从地球观察火星 轨迹 从地球观察金星的运动轨迹

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

免费轻巧多功能 PDF 处理工具:转换、压缩、提取一应俱全

软件技术 今天要给大家分享一款超实用的 PDF 处理工具&#xff0c;它免费又轻巧&#xff0c;如同随时待命的得力小帮手&#xff0c;功能之强大超乎想象&#xff0c;真的值得大家收藏。 这款工具是绿色版软件&#xff0c;解压后开启&#xff0c;满满的 PDF 处理功能便映入眼帘…

基于ssm的校园跑腿管理系统+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统共有管理员、用户两个角色 管理员主要的功能用户信息管理、任务信息管理、任务类型管理、接单信息管理、公告信息管理、投诉信息管理、公告类型管…

java数据结构_Map和Set_9.1

1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有的结点都小于根结点的值若它的右子树不为空&#xff0c;则右子树上所有的结点都大于根结点的值…