搜索
bottom↓
回复: 14

请教C++中的一个结构体,怎么转到C#中

[复制链接]

出0入0汤圆

发表于 2019-3-13 00:28:03 | 显示全部楼层 |阅读模式
请高手将下面的代码转到C#中:
struct A
{
    byte DataLen;

    byte Data[8];

    byte Reserved[3];

}
struct B
{
        A usA[200];
        A usB[200];

        volatile  WORD usTxWrite;                       
        volatile  WORD UInt16 usTxRead;                       
        volatile  WORD UInt16 usRxWrite;                       
        volatile  WORD UInt16 usRxRead;
        HANDLE usSend;
        HANDLE usReceived;
        CRITICAL_SECTION usCs;
        void (*callback)(void);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-3-13 02:51:17 来自手机 | 显示全部楼层
struct用class,callback用event

出0入0汤圆

发表于 2019-3-13 06:16:02 来自手机 | 显示全部楼层
C++中有byte类型吗?没见过

出0入0汤圆

发表于 2019-3-13 09:51:10 | 显示全部楼层
能力有限,只能写成这样了,不知道能不能用。
CRITICAL_SECTION 贴出来,没法写。

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct A
        {
            public Byte DataLen;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public byte[] Data;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
            public byte[] Reserved;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        struct B
        {
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 200, ArraySubType = UnmanagedType.Struct)]
            public A[] usA;
            [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 200, ArraySubType = UnmanagedType.Struct)]
            public A[] usB;

            public ushort usTxWrite;
            public UInt16 usTxRead;
            public UInt16 usRxWrite;
            public UInt16 usRxRead;
            IntPtr usSend;
            IntPtr usReceived;
            public CRITICAL_SECTION usCs;
            public delegate void callback();
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct CRITICAL_SECTION
        {
        }

出870入263汤圆

发表于 2019-3-13 14:44:30 | 显示全部楼层
这种转换关键看你要不要把这个用于平台调用(pinvoke),如果需要把内存块传递给原生代码那就要严格的布局一致;如果完全在托管CLR代码内使用,随便怎么写都可以!

出0入0汤圆

 楼主| 发表于 2019-3-13 22:39:04 | 显示全部楼层
小溪 发表于 2019-3-13 06:16
C++中有byte类型吗?没见过

typedef unsigned char       BYTE;

出0入0汤圆

 楼主| 发表于 2019-3-13 22:41:49 | 显示全部楼层
q457344370 发表于 2019-3-13 02:51
struct用class,callback用event

能否举个例子?
还有谢谢你上次的提醒,kvaser我已经弄好了。c#现在遇到新的困难了。。。

出0入0汤圆

 楼主| 发表于 2019-3-13 22:45:00 | 显示全部楼层
pursuits 发表于 2019-3-13 09:51
能力有限,只能写成这样了,不知道能不能用。
CRITICAL_SECTION 贴出来,没法写。

谢谢,CRITICAL_SECTION是C++内部封装库里面的,
typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;

typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

    //
    //  The following three fields control entering and exiting the critical
    //  section for the resource
    //

    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;        // from the thread's ClientId->UniqueThread
    HANDLE LockSemaphore;
    DWORD SpinCount;
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

难道要全部搬过来?

出0入0汤圆

 楼主| 发表于 2019-3-13 22:49:54 | 显示全部楼层
armstrong 发表于 2019-3-13 14:44
这种转换关键看你要不要把这个用于平台调用(pinvoke),如果需要把内存块传递给原生代码那就要严格的布局 ...

太专业了,小白表示没理解。。。

出0入0汤圆

发表于 2019-3-13 23:25:14 | 显示全部楼层
推荐 LZ 看一下《精通.NET互操作》,网上有 PDF 电子版的
了解数据封送的一些基础知识后,以后这类问题就都能解决了

出0入0汤圆

 楼主| 发表于 2019-3-13 23:26:13 | 显示全部楼层
wudicgi 发表于 2019-3-13 23:25
推荐 LZ 看一下《精通.NET互操作》,网上有 PDF 电子版的
了解数据封送的一些基础知识后,以后这类问题就都 ...

非常感谢,非常感谢。

出0入0汤圆

 楼主| 发表于 2019-6-17 23:52:42 | 显示全部楼层
armstrong 发表于 2019-3-13 14:44
这种转换关键看你要不要把这个用于平台调用(pinvoke),如果需要把内存块传递给原生代码那就要严格的布局 ...

您好,我用【Dllimport dll】方式调用了C++的函数,可是执行下来运行速度反而比VC慢很多,是怎么回事?

出870入263汤圆

发表于 2019-6-18 15:54:07 | 显示全部楼层
zw_7627 发表于 2019-6-17 23:52
您好,我用【Dllimport dll】方式调用了C++的函数,可是执行下来运行速度反而比VC慢很多,是怎么回事? ...

不要频繁的调用原生函数,应该减少调用次数;而每次调用的原生函数应尽量多地做事。
每次平台调用,都是一个资源分配和数据拷贝的交互过程,会有资源和性能消耗。

出0入0汤圆

发表于 2019-6-20 10:38:01 | 显示全部楼层
小溪 发表于 2019-3-13 06:16
C++中有byte类型吗?没见过

C++中的unsigned char就是C#byte

出0入0汤圆

 楼主| 发表于 2019-6-24 12:25:58 | 显示全部楼层
armstrong 发表于 2019-6-18 15:54
不要频繁的调用原生函数,应该减少调用次数;而每次调用的原生函数应尽量多地做事。
每次平台调用,都是 ...

请教下关于C#线程同步的问题,我开了一个线程下载,需要在另一个接收线程里执行一个set();我在下载线程用了waitone,但实际是接收线程里的set()并未执行,请问下是什么原因?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 13:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表