C++ 调用 C# - DllExport 方案
3F/DllExport: .NET DllExport with .NET Core support (aka 3F/DllExport aka DllExport.bat)
目前还不支持 .NET6 以及后续的版本,看起来作者生活上遇到了一些麻烦,暂时也不打算处理了
.NET 6 支持 · 问题 #219 · 3F/DllExport --- .NET 6 support · Issue #219 · 3F/DllExport
使用方法#
Step 1 下载
下载 DllExport.bat ,放到 sln 解决方案文件夹
Step 2 C# 端配置
运行 bat,选中需要导出的项目,勾选 Installed,对于 Core 项目,勾选右下角的几个选线。
Step 3 C# 端导出
使用 DllExport 标记需要导出的函数
复杂数据的处理,需要使用结构体进行包装
[StructLayout(LayoutKind.Sequential)]
public struct Person
{
[MarshalAs(UnmanagedType.LPStr)]
public string Id;
[MarshalAs(UnmanagedType.LPStr)]
public string Name;
public int Age;
}
cpp 端需要有对应的定义
struct Person
{
const std::string Id;
const std::string Name;
int Age;
};
Step 4 C++ 使用
使用 LoadLibrary 的方式进行加载和调用,参考:C++ 调用 C# - AOT 方案
补充#
因为不支持 .NET 6 以及后续版本,这里没有完全调通。
在 C# 中,无法调用框架中的函数,如 Console.WriteLine,调用就会出现如下错误
0x00007FFDDED8FABC (KernelBase.dll) (VisitorDemo.exe 中)处有未经处理的异常: 0xE0434352 (参数: 0xFFFFFFFF80070002, 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, 0x00007FFDCB6A0000)。
无法加载框架文件,在 github issue 中搜索 0xE0434352 可以了解更多内容,但是在 .NET6 下还是无法处理的。
因为没有最终走通,所以,以上代码仅供参考,可以在 GitHub - 3F/Examples: An complete examples and related support for various popular projects, and more. 找到作者提供的 Example.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)