C# 调用 C++ DLL,参数为结构体

独行~背包客 2020-05-09 09:12:14
在C#中调用C++ dll中函数接口,传一个结构体过去,结构体中char*的位置,会导致传参的结果发生变化,不知道为什么
C#端:
[DllImport("Dll_Test.dll", EntryPoint = "Interface_Sub", CallingConvention = CallingConvention.Cdecl)]
public extern static int Interface_Sub(ref Sub sub);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Sub
{
public IntPtr path;
public int num;
};
private void FuncSub()
{
var sub = new Sub();
sub.path = Marshal.StringToHGlobalAnsi("TestSub");
sub.num = 5;
var rst = Interface_Sub(ref sub);
}

C++端:
struct Sub
{
char* path;
int num;
};
extern "C" __declspec(dllexport) int Interface_Sub(Sub* sub);
int Interface_Sub(Sub* sub)
{
return 5;
}


其他位置一模一样,只是调整结构体中path和num的位置,就会导致sub结果不一样
path在上,num在下,传参结果正确:

num在上,path在下,传参结果有问题:


有那位大神可以帮忙解释下吗?是代码问题,还是有什么相关机制导致的?谢谢!


...全文
476 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
独行~背包客 2020-05-12
  • 打赏
  • 举报
回复
感谢诸位,本帖问题已经得到解决,但还有一个相当于进阶的问题,也是关于结构体传参的问题,在另外一个刚开的帖子中,请各位大神移步,帮忙看一下,谢谢! https://bbs.csdn.net/topics/396531722
wanghui0380 2020-05-12
  • 打赏
  • 举报
回复
对,问题没错。涉及到内存对齐,封送结构体,两边对齐方式要一样,不然就对不上了
独行~背包客 2020-05-12
  • 打赏
  • 举报
回复
引用 1 楼 sgyiliya 的回复:
你试下,在c#里面把数据转换为byte[],用byte[]类型的数据传递给c++里面的char*这个类型
1.一般的数据类型可以转byte[],但是自定义的数据结构类型如何转,而且是比较复杂的嵌套型的结构类型? 2.针对上面遇到的问题,已经解决了如下,在定义结构体是改下属性设置,不要设置pack
        public extern static int Interface_Sub(ref Sub sub);
        //[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
       [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]//不要上面的"Pack = 1"
        public struct Sub
        {
            public IntPtr path;
            public int num;
        };
        private void FuncSub()
        {
            var sub = new Sub();
            sub.path = Marshal.StringToHGlobalAnsi("TestSub");
            sub.num = 5;
            var rst = Interface_Sub(ref sub);
        }
这样就ok了
sgyiliya 2020-05-09
  • 打赏
  • 举报
回复
你试下,在c#里面把数据转换为byte[],用byte[]类型的数据传递给c++里面的char*这个类型
内容概要:本文介绍了一个基于Java与Vue的中小银行信贷材料结构化审核与尽调要点抽取系统的设计与实现。系统通过OCR识别、版面解析、关键字段抽取、实体归一化、规则引擎和风险评分等技术,将非结构化的信贷材料(如营业执照、审计报告、银行流水、合同等)转化为可查询、可校验的结构化数据,实现材料自动分类、字段提取、完整性检查、跨文档一致性比对及风险线索识别。系统涵盖文件接入、文档识别、字段抽取、规则校验、风险评分与前端交互六大层次,提升了信贷审核效率、统一了审查标准、增强了风险预警能力,并建立了可追溯的数据资产体系。文中还提供了企业名称清洗、统一社会信用代码校验、金额抽取、材料完整性校验、名称相似度计算和风险评分等核心功能的模型描述与Java代码示例。; 适合人群:具备Java和Vue开发基础,从事金融科技、信贷系统开发或智能文档处理相关工作的研发人员,尤其是关注OCR、NLP与规则引擎在金融风控中应用的工程师和技术负责人。; 使用场景及目标:① 实现中小银行信贷材料的自动化结构化处理与智能审核;② 提升信贷审批效率,降低人工核验成本;③ 统一尽调标准,增强风险识别与预警能力;④ 构建可追溯、可审计的信贷数据资产,支持贷后管理与监管合规。; 阅读建议:此资源以实际项目为导向,结合业务需求与技术实现,建议开发者结合代码示例深入理解各模块设计逻辑,重点关注实体归一化、规则引擎配置与前后端协同机制,并可在类似场景中复用核心算法与架构设计。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧