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

如何在非托管C++中加载.NET Core程序集并实现跨语言互调与跨平台适配?

.NET Core下C#与非托管C++互调实现

1. 非托管C++调用C# DLL

在.NET Core(及后续.NET 5+)环境下,最直接的方案是Native AOT编译:

  • 在C#类库中,用[UnmanagedCallersOnly(EntryPoint = "YourFunctionName")]特性标记要导出给C++的方法,方法参数和返回值需使用原生类型(如int、char*,避免托管类型)。
  • 在项目文件(.csproj)中启用Native AOT:添加<PublishAot>true</PublishAot>配置,执行dotnet publish -r <目标平台>(例如win-x64、linux-x64)编译为原生DLL。
  • 非托管C++中只需声明对应函数签名,即可像调用普通原生DLL一样调用C#导出的方法。

另外也可使用COM互操作,但步骤繁琐,Native AOT是当前推荐的轻量方案。

2. C#调用非托管C++函数

这和Mono的内部调用逻辑类似,用.NET的**P/Invoke(平台调用)**即可:

  • 将C函数编译为原生DLL,确保函数用extern "C"修饰(避免C名称 mangling)。
  • 在C#代码中用[DllImport("YourCppDllName.dll")]特性声明要调用的C++函数,指定函数名、参数和返回值类型后直接调用。
  • 若需复杂交互,也可使用C++/CLI作为中间层,但.NET Core下P/Invoke足以应对大多数场景,且无需额外依赖。
跨平台运行与编译问题

普通.NET Core类库(IL代码)

Windows上编译的纯C#类库(.dll)是IL中间代码,本身跨平台——只要目标平台(Linux、macOS等)安装了对应版本的.NET运行时,就能正常加载运行。但如果C#类库依赖特定平台的原生C++ DLL,则必须为每个平台单独编译对应的C++原生库,因为原生代码与平台/架构绑定。

Native AOT编译的二进制

若用Native AOT编译C#类库,生成的是目标平台的原生机器码,Windows编译的产物仅能在Windows运行,Linux和macOS需分别在对应平台执行dotnet publish -r <目标平台>命令,生成对应平台的二进制文件。

总结:

  • 无原生依赖的纯C#类库:一次编译,跨平台运行(需对应.NET运行时)。
  • 包含原生C++依赖或用Native AOT编译的:必须为每个目标平台单独编译对应版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:55:26