You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用UnmanagedCallersOnly导出C#函数未被检测到

如何用C# .NET 7导出可供原生DLL调用的函数

你当前的项目是普通托管类库,UnmanagedCallersOnly特性仅在Native AOT编译时才会生成原生函数导出表,普通Build输出的托管DLL不会包含这些导出项,因此dumpbin.exe无法检测到导出内容。以下是正确的实现步骤:

1. 修改项目文件(.csproj)

需要启用Native AOT编译,并调整项目属性以支持原生DLL输出:

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

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
    <!-- Native AOT不支持AnyCPU,必须指定具体架构 -->
    <Platforms>x64;x86</Platforms>
    <!-- 启用Native AOT编译 -->
    <PublishAot>true</PublishAot>
    <!-- 指定输出类型为原生库 -->
    <OutputType>Library</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Diagnostics.Runtime" Version="3.1.512801" />
    <PackageReference Include="Microsoft.Diagnostics.Runtime.Utilities" Version="3.0.442202" />
  </ItemGroup>

</Project>

2. 确认代码合规性

你的现有代码已经满足UnmanagedCallersOnly的核心要求:

  • 方法为静态方法
  • 标记了[UnmanagedCallersOnly(EntryPoint = "xxx")]特性
  • 启用了AllowUnsafeBlocks(即使方法未直接使用unsafe代码,该设置也不影响)

3. 发布项目(关键步骤)

Native AOT是发布阶段编译,不能使用普通Build操作。打开终端进入项目目录,执行对应架构的发布命令:

# 发布x64架构的原生DLL
dotnet publish -c Release -r win-x64

# 发布x86架构的原生DLL
dotnet publish -c Release -r win-x86

发布完成后,原生DLL会生成在bin/Release/net7.0/[架构]/publish目录下。

4. 验证导出函数

使用dumpbin.exe查看发布后的DLL:

dumpbin.exe /EXPORTS 你的发布路径/lib1.dll

此时就能看到test1和test2的导出项。

额外注意事项

  • 若未安装Native AOT组件,需先执行dotnet workload install nativeaot命令安装
  • 禁止使用AnyCPU平台,必须指定x64或x86等具体架构
  • UnmanagedCallersOnly标记的方法参数/返回值必须是原生可识别类型(如int、char*等),不能使用托管类型

内容的提问来源于stack exchange,提问作者DavidT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 08:36:30