本示例演示了如何在 Node.js 中调用 .NET AOT (Ahead-of-Time) 编译的 DLL 文件。
dotnet new console -o DotNetAotLibrary
cd DotNetAotLibrary
将示例中的 NativeExports.cs 文件添加到项目中。
编辑 DotNetAotLibrary.csproj,修改以下配置:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<TargetFramework>net9.0</TargetFramework>
<PublishAot>true</PublishAot>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
dotnet publish -c Release -r win-x64
编译完成后,DLL 文件将位于 bin/Release/net9.0/win-x64/publish/ 目录下。
npm init -y
npm install ffi-napi ref-napi
注意:如果安装 ffi-napi 时遇到构建错误,可能需要:
修改 DLL 路径
编辑 call-aot-dll.js 文件,将 DLL 路径修改为实际编译后的路径(如果需要):
const myAotLibrary = ffi.Library('./DotNetAotLibrary/bin/Release/net9.0/win-x64/publish/DotNetAotLibrary.dll', {
// ...
});
运行基础脚本
node call-aot-dll.js
使用分组 API 创建一个新的 JavaScript 文件,使用分组后的 API:
const { Math, String, Json, Version } = require('./dotnet-api');
// 调用数学运算
console.log(Math.add(10, 20));
// 调用字符串处理
console.log(String.toUpper('hello'));
// 调用 JSON 处理
const result = Json.processJson(JSON.stringify({ id: 1, name: '测试' }));
console.log(result);
// 调用版本获取
console.log(Version.getVersion());
运行分组 API 测试
node test-dotnet-api.js
NodeApi/ ├── DotNetAotLibrary/ │ ├── NativeExports.cs # 主要导出功能 │ ├── MathExports.cs # 数学运算功能 │ ├── StringExports.cs # 字符串处理功能 │ └── DotNetAotLibrary.csproj # 项目配置 ├── call-aot-dll.js # 基础调用脚本 ├── dotnet-api.js # 分组 API 封装 ├── test-dotnet-api.js # 分组 API 测试 └── README.md # 项目说明文档
多类导出设计:
MathExports:数学运算方法(Add、Subtract、Multiply、Divide)StringExports:字符串处理方法(GetLength、ToUpper、ToLower、Concat)NativeExports:原始功能方法(CalculateSum、ProcessString、GetVersion、ProcessJsonData)函数导出特性:
[UnmanagedCallersOnly] 特性导出函数,指定 EntryPointMath_、String_、CalculateSum 等UTF-8 字符串处理:
StringToUtf8Ptr:将字符串转换为 UTF-8 编码的指针Utf8PtrToString:从指针读取 UTF-8 编码的字符串JSON 序列化配置:
JsonSourceGenerationOptions 配置 JSON 序列化分组 API 设计:
MathApi:封装数学运算方法StringApi:封装字符串处理方法JsonApi:封装 JSON 处理方法VersionApi:封装版本信息获取方法FFI 调用:
ffi-napi 模块加载和调用 DLL内存管理:
FreeMemory 函数异常处理:
| .NET 类型 | C 类型 | ffi-napi 类型 |
|---|---|---|
| int | int | 'int' |
| string | char* | 'string' |
| bool | bool | 'bool' |
| double | double | 'double' |
| IntPtr | void* | 'pointer' |
FreeMemory 函数释放 DLL 中分配的内存,避免内存泄漏JsonSourceGenerationOptions 配置 JSON 序列化,支持多种高级选项