求助,急,c++和c#之间数据封送问题

问题描述

这个是一个联合体中有两个结构体,每个结构体内部数据结构可能会差别较大。怎么在c#那边构造出相同的数据结构来取数据?typedefunion{struct{shortS1Short;longS1Long;charS1Char;}S1;struct{charS2CharA[20];__int64S2Int64;shortS2Short;}S2;}TestUnion;//数据结构extern"C"_declspec(dllexport)int_stdcalloutUnion(TestUnion(&data)[12])//供c#调用的外部方法{data[1].S1.S1Char='B';//省略....data[5].S1.S1Long=6666;//省略.....data[10].S1.S1Short=2222;//省略.....return1;}

我现在的c#代码和数据结构在下面[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]publicstructStruct1{///shortpublicshortS1Short;///intpublicintS1Long;///charpublicbyteS1Char;}[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential,CharSet=System.Runtime.InteropServices.CharSet.Ansi)]publicstructStruct2{///char[20][System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr,SizeConst=20)]publicstringS2CharA;///__int64publiclongS2Int64;///shortpublicshortS2Short;}[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)]publicstructTestUnion{[System.Runtime.InteropServices.FieldOffsetAttribute(0)]publicStruct1S1;[System.Runtime.InteropServices.FieldOffsetAttribute(0)]publicStruct2S2;}[DllImport("Win32DynamicDll.dll")]publicstaticexternintoutUnion(refTestUnion[]TU);privatevoidGrid1_Loaded(objectsender,RoutedEventArgse){TestUnion[]TU=newTestUnion[15];outUnion(refTU);return;}

这里运行的时候会出错,应该是C#数据结构体的问题([System.Runtime.InteropServices.FieldOffsetAttribute(0)]这句有问题),请问要如何才能实现在c#这边得到数据?得到的数组里是S1或者S2都有可能。高人指导了,谢谢啊!很急

解决方案

时间: 2024-10-01 06:42:15

求助,急,c++和c#之间数据封送问题的相关文章

C#调用COM组件时的结构类型数据封送问题,报PInvoke 签名错误

问题描述 Com的idl[id(4),helpstring("methodStructureTest")]HRESULTStructureTest(MyPointa);结构申明typedefstructPoint{intx;inty;}MyPoint;C#中结构包装,函数包装[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]publicstructPoint{[MarshalAs(UnmanagedType.I4)]pu

.NET简谈互操作(七:数据封送之介绍)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用) .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.互操作的基础知识已经差不多完了,当然一篇小小的文章很难全面的讲述互操作的方方面面,本人只是总结出关键的地

CLR完全介绍: 托管代码与非托管代码之间的封送处理

让我们面对现实吧.这个世界并不完美.几乎很少有公司在完全用托管代码开发程序,除此之外仍存在很多需要您处理的旧式非托管代码.您怎样将托管和非托管项目集成起来呢?在形式上是采用从托管应用程序调用非托管代码,还是从非托管代码应用程序调用托管代码? 幸运的是,Microsoft .NET Framework 互操作在托管和非托管代码之间开辟了一条通道,而封送处理则在该连接中扮演着非常重要的角色,因为它允许在两者之间进行数据交换(请参见图 1).有很多因素会影响 CLR 在非托管和托管领域之间封送数据的方

ext-Ext form与grid之间数据交换

问题描述 Ext form与grid之间数据交换 选择表格中一行,通过form.getForm().loadRecord()方法将一行记录加载到表单中,但是表单中combobox如果不选择,提交到后台的数据不是valueField,而是dispalyField的值,我使用的是DWR实现前后台交互,急求大神指点!

ssh2-【求助】Android与SSH2之间的通信

问题描述 [求助]Android与SSH2之间的通信 Andorid客户端与Web服务器通信(Web服务器用的是SSH2搭建的),数据从客户端到了action(数据正确),action里的biz类竟然是null,然后程序就走不下去了,也不报空指针异常.如果我在aciton 自己new了biz类 在biz处理业务时dao也遇到相同的问题,是个null ,等我同样自己去new dao类时,就在dao里面保存数据时出错(super.getHibernateTemplate().save(user)),

iOS实现两个控制器之间数据的双向传递_IOS

本文为大家分享了iOS控制器之间数据的双向传递,供大家参考,具体内容如下 首先,有两个控制器,分别为控制器A.控制器B. A->B:数据由控制器A传向控制器B,这叫做数据的顺传:数据由控制器B传向控制器A,这叫做逆传. 顺传:一般通过创建目标控制器对象,将数据赋值给对象的成员来完成: 逆传:一般使用代理来实现,其中控制器A是控制器B的代理(控制器A监听控制器B,控制器B通知控制器A). 下面是博主写的简单实现了两个控制间实现数据的双向传递的app的demo: 1.这是界面设计: FirstVie

事件-android surfaceview 和activity之间数据传递

问题描述 android surfaceview 和activity之间数据传递 想实现一个功能 就是在mainActivity中放置一个surfaceview和一个Textview 在surfaceview中添加点击onTouch事件 每次点击 让自己定义的surfaceview的变量 step加一 并时时在mainActivity的TextView中更新step的显示 不知道问题有没有描述清楚 就是想在一个view中时时显示另外一个view中定义的变量 解决方案 public class M

DataX实现oracle到oracle之间数据传递

文章讲的是DataX实现oracle到oracle之间数据传递,首先需要注意的是DATAX是通过JDBC的方式读取ORACLE数据,然后通过OCI的方式写数据,DX也可以通过JDBC写的方式进行,但是OCI比JDBC速度更快. 进入DataX安装目录的bin目录,执行命令 ./datax.py -e 输入交换数据数据库对应的代码,它会自动生成相应的xml配置文件 编辑配置文件参数,有"?"的是必须配置的,默认的可以保持不变 执行代码: vi /home/taobao/datax/job

协议-多应用之间数据如何交换?

问题描述 多应用之间数据如何交换? 各位大神好,最近小弟遇到麻烦问题,特请教:背景:目前服务器上有五个WEB应用,每个应用对应有一个数据库问题:应用与应用之间经常要调用功能模块或者数据交换目前我采取POST方法交换数据,随着需求增加,维护就变得很麻烦,现在我的初步想法如下:1.写一个单独的数据交换接口,简称数据交换机,编写API,拟定交换协议,2.全部应用的数据存储调度全部通过该数据交换机进行,每个应用都可以调用API操作数据,只要符合协议3.应用之间功能模块调用还是使用POST方法进行调用 目