从ANSI C调用.NET 6 C#时DllExport报错,求无第三方库解决方案
不用第三方库实现ANSI C调用.NET 6 C#方法的正确方案
错误原因说明
- .NET 6本身没有内置
DllExportAttribute,你使用的该属性属于第三方库(如UnmanagedExports),因此编译时会报找不到的错误。 CallingConvention的错误源于命名空间引用问题,但核心矛盾是DllExport并非.NET原生特性,必须换用官方支持的导出方式。
正确实现方案(使用.NET Native AOT)
.NET 6及以上版本支持Native AOT编译,可将.NET代码编译为原生机器码DLL,直接导出函数供ANSI C调用,全程无需第三方库。
步骤1:创建并配置项目
- 创建一个.NET 6类库项目(或控制台项目)。
- 编辑项目文件(
.csproj),添加以下配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Library</OutputType> <TargetFramework>net6.0</TargetFramework> <PublishAot>true</PublishAot> <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 根据系统选择,如linux-x64、osx-x64 --> <NativeLib>Shared</NativeLib> <!-- 指定生成共享库(DLL) --> </PropertyGroup> </Project>
步骤2:编写导出函数代码
使用.NET 6+原生的[UnmanagedCallersOnly]属性标记要导出的函数,指定导出名称和调用约定:
using System.Runtime.InteropServices; public static class NativeExports { // 导出名为"add",调用约定为StdCall,适配ANSI C调用 [UnmanagedCallersOnly(EntryPoint = "add", CallingConvention = CallingConvention.StdCall)] public static int Add(int left, int right) { return left + right; } }
步骤3:编译生成DLL
在终端执行发布命令:
dotnet publish -c Release
发布完成后,可在bin/Release/net6.0/<RuntimeIdentifier>/publish目录下找到生成的DLL文件(Windows下为.dll,Linux下为.so)。
步骤4:ANSI C调用示例
以下是Windows平台下的ANSI C调用代码:
#include <stdio.h> #include <windows.h> // 声明导出函数的原型 typedef int (__stdcall *AddFunc)(int, int); int main() { HMODULE hDll = LoadLibrary("YourDotNetDllName.dll"); if (hDll == NULL) { printf("加载DLL失败\n"); return 1; } AddFunc add = (AddFunc)GetProcAddress(hDll, "add"); if (add == NULL) { printf("获取函数地址失败\n"); FreeLibrary(hDll); return 1; } int result = add(3, 5); printf("3 + 5 = %d\n", result); FreeLibrary(hDll); return 0; }
注意事项
RuntimeIdentifier需匹配你的操作系统和硬件架构(如win-x86、linux-x64等)。- Native AOT编译需要安装对应.NET SDK组件,Windows平台可能需要Visual Studio的C++编译工具链。
- 导出函数的参数和返回值必须为原生类型(int、float、指针等),复杂数据需通过指针或结构体进行封送处理。
内容的提问来源于stack exchange,提问作者Aleksej
相关产品推荐
相关产品推荐

