Skip to content

c#开发的dll如何AOT编译成独立的dll

约 549 字大约 2 分钟

c#AOT

2026-02-11

新建dll项目

新建一个名为AotMathDll的c#的.net版本的dll项目,然后选择支持AOT编译的.net版本,.net8.0及以上版本。

替换默认的 Class1.cs 代码为以下内容(包含跨平台调用的特性标记):

using System;
using System.Runtime.InteropServices;

// 命名空间可自定义
namespace AotMathDll
{
    // 标记为公共类,供外部调用
    public class MathHelper
    {
        // 标记为静态方法,简化调用;添加UnmanagedCallersOnly特性,让AOT编译后可被原生代码调用
        [UnmanagedCallersOnly(EntryPoint = "AddTwoInt")]
        public static int AddTwoInt(int a, int b)
        {
            try
            {
                return a + b;
            }
            catch (Exception ex)
            {
                // 简单异常处理,返回-1标识错误
                Console.WriteLine($"计算错误:{ex.Message}");
                return -1;
            }
        }
    }
}

以上例子只有一个方法,那就是求两个整数的和。

修改项目文件

在解决方案资源管理器中,右键点击项目 AotMathDll → 选择「编辑项目文件」。

替换默认内容为以下配置(核心是启用 AOT、自包含、指定运行时):

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

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <!-- 启用AOT编译 -->
    <PublishAot>true</PublishAot>
    <!-- 自包含(不依赖系统.NET运行时) -->
    <SelfContained>true</SelfContained>
    <!-- 指定目标运行时(根据你的系统选择,例如win-x64/win-x86/linux-x64) -->
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <!-- 生成原生DLL(而非托管DLL) -->
    <OutputType>Library</OutputType>
    <!-- 禁用调试符号(发布时可选) -->
    <DebugType>none</DebugType>
    <DebugSymbols>false</DebugSymbols>
  </PropertyGroup>

</Project>

发布(AOT编译)项目

AOT 编译仅在「发布」阶段生效,普通的「生成」不会触发 AOT:

  1. 右键点击项目 AotMathDll → 选择「发布」。

  2. 在发布配置界面:

    • 目标:选择「文件夹」→ 「下一步」。
    • 位置:默认路径(或自定义)→ 「完成」。
  3. 点击「显示所有设置」,确认配置:

    • 配置:Release

    • 目标框架:net8.0

    • 运行时:与项目文件中RuntimeIdentifier一致(如 win-x64)

    • 部署模式:独立

  4. 点击「发布」,等待编译完成(AOT 编译耗时比普通编译长)。

  5. 编译后的dll默认在:项目所在文件夹\bin\release\net8.0\win-x64\publish\win-x64

本博客采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可