求助:使用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
相关产品推荐
相关产品推荐

