前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >C++ 调用 C# - DllExport 方案

C++ 调用 C# - DllExport 方案

作者头像
jgrass
发布2024-12-25 18:36:28
发布2024-12-25 18:36:28
7600
代码可运行
举报
文章被收录于专栏:蔻丁杂记
运行总次数:0
代码可运行

3F/DllExport: .NET DllExport with .NET Core support (aka 3F/DllExport aka DllExport.bat)

目前还不支持 .NET6 以及后续的版本,看起来作者生活上遇到了一些麻烦,暂时也不打算处理了

无法使用 .NET 6 工作 · 问题 #197 · 3F/DllExport --- Unable to get working using .NET 6 · Issue #197 · 3F/DllExport

.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 标记需要导出的函数

复杂数据的处理,需要使用结构体进行包装

代码语言:javascript
代码运行次数:0
复制
[StructLayout(LayoutKind.Sequential)]public struct Person{    [MarshalAs(UnmanagedType.LPStr)]    public string Id;
    [MarshalAs(UnmanagedType.LPStr)]    public string Name;
    public int Age;}

cpp 端需要有对应的定义

代码语言:javascript
代码运行次数:0
复制
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.

原文链接: https://cloud.tencent.com/developer/article/2481584

本作品采用 「署名 4.0 国际」 许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024年9月7日 |,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用方法
  • 补充
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档