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

打印 上一主题 下一主题

主题 817|帖子 817|积分 2451

1、创建.Net8的库,双击解决方案中的项目,修改如下,启用AoT:
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <PropertyGroup>
  3.     <OutputType>Library</OutputType>
  4.     <PublishAot>true</PublishAot>
  5.     <IsAotCompatible>true</IsAotCompatible>
  6.     <CopyRefAssembliesToPublishDirectory>true</CopyRefAssembliesToPublishDirectory>
  7.     <TargetFramework>net8.0</TargetFramework>
  8.     <ImplicitUsings>enable</ImplicitUsings>
  9.     <Nullable>enable</Nullable>
  10.   </PropertyGroup>
  11. </Project>
复制代码
在Class1.cs文件中加入如下代码:
  1. using System.Runtime.InteropServices;
  2. namespace AoT001
  3. {
  4.     public class Export
  5.     {
  6.         [UnmanagedCallersOnly(EntryPoint = "Add")]
  7.         public static int Add(int a, int b)
  8.         {
  9.             return a + b;
  10.         }
  11.         [UnmanagedCallersOnly(EntryPoint = "Combine")]
  12.         public static IntPtr Combine(IntPtr str, int num)
  13.         {
  14.             var name = nameof(Export);
  15.             string? inputStr = Marshal.PtrToStringAnsi(str);
  16.             string? result = $"{inputStr} -- {num} -- {name}";
  17.             return Marshal.StringToHGlobalAnsi(result);
  18.         }
  19.         [UnmanagedCallersOnly(EntryPoint = "Free")]
  20.         public static void Free(IntPtr ptr)
  21.         {
  22.             Marshal.FreeHGlobal(ptr);
  23.         }
  24.     }
  25. }
复制代码
右键,AoT库项目, 发布,弹出如下图,按步调配置:

注意:AoT仅支持win-x64
点击发布后,启动编译过程,结果如下图:

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

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

  1. namespace Winform472
  2. {
  3.     public partial class Form1 : Form
  4.     {
  5.         public Form1()
  6.         {
  7.             InitializeComponent();
  8.         }
  9.         private void Form1_Load(object sender, EventArgs e)
  10.         {
  11.         }
  12.         private void button1_Click(object sender, EventArgs e)
  13.         {
  14.             var sum = AoTHelp.Add(1111, 1112);
  15.             var str1 = "Hello World 0001";
  16.             var ptr1 = Marshal.StringToHGlobalAnsi(str1);
  17.             var ptr2 = AoTHelp.Combine(ptr1, 500);
  18.             var str2 = Marshal.PtrToStringAnsi(ptr2);
  19.             AoTHelp.Free(ptr2);
  20.             MessageBox.Show($"Hello, World! {sum}  {str2}");
  21.         }
  22.     }
  23.     public static class AoTHelp
  24.     {
  25.         [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
  26.         public static extern int Add(int a, int b);
  27.         [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
  28.         public static extern IntPtr Combine(IntPtr str, int sum);
  29.         [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
  30.         public static extern void Free(IntPtr ptr);
  31.     }
  32. }
复制代码
点击按钮界面如下:


在AoT库中引入MathNet.Numerics库,测试使用三方库后AoT创建dll的情况,新增函数:
  1.         [UnmanagedCallersOnly(EntryPoint = "UseThirdLibTest")]
  2.         public static bool UseThirdLibTest(int a, int b)
  3.         {
  4.             var D = Matrix<double>.Build.Dense(2, 9, 1);
  5.             Console.WriteLine(D);
  6.             return MathNet.Numerics.Control.Equals(a, b);
  7.         }
复制代码
重新发布后dll拷贝到调用项目的debug子命令,dll大下从1.3M变为1.8M。调用代码如下:
  1.         [DllImport("AoT001.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
  2.         public static extern bool UseThirdLibTest(int a, int b);
  3.         private void button2_Click(object sender, EventArgs e)
  4.         {
  5.             var res = AoTHelp.UseThirdLibTest(100, 100);
  6.             MessageBox.Show(res.ToString());
  7.         }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表