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

从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:创建并配置项目

  1. 创建一个.NET 6类库项目(或控制台项目)。
  2. 编辑项目文件(.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:50:30