zw_7627 发表于 2019-3-13 00:28:03

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

请高手将下面的代码转到C#中:
struct A
{
    byte DataLen;

    byte Data;

    byte Reserved;

}
struct B
{
        A usA;
        A usB;

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

q457344370 发表于 2019-3-13 02:51:17

struct用class,callback用event

小溪 发表于 2019-3-13 06:16:02

C++中有byte类型吗?没见过

pursuits 发表于 2019-3-13 09:51:10

能力有限,只能写成这样了,不知道能不能用。
CRITICAL_SECTION 贴出来,没法写。

      
      public struct A
      {
            public Byte DataLen;
            
            public byte[] Data;
            
            public byte[] Reserved;
      }

      
      struct B
      {
            
            public A[] usA;
            
            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();
      }

      
      public struct CRITICAL_SECTION
      {
      }

armstrong 发表于 2019-3-13 14:44:30

这种转换关键看你要不要把这个用于平台调用(pinvoke),如果需要把内存块传递给原生代码那就要严格的布局一致;如果完全在托管CLR代码内使用,随便怎么写都可以!

zw_7627 发表于 2019-3-13 22:39:04

小溪 发表于 2019-3-13 06:16
C++中有byte类型吗?没见过

typedef unsigned char       BYTE;

zw_7627 发表于 2019-3-13 22:41:49

q457344370 发表于 2019-3-13 02:51
struct用class,callback用event

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

zw_7627 发表于 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;

难道要全部搬过来?

zw_7627 发表于 2019-3-13 22:49:54

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

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

wudicgi 发表于 2019-3-13 23:25:14

推荐 LZ 看一下《精通.NET互操作》,网上有 PDF 电子版的
了解数据封送的一些基础知识后,以后这类问题就都能解决了

zw_7627 发表于 2019-3-13 23:26:13

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

非常感谢,非常感谢。

zw_7627 发表于 2019-6-17 23:52:42

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

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

armstrong 发表于 2019-6-18 15:54:07

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

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

canlin029 发表于 2019-6-20 10:38:01

小溪 发表于 2019-3-13 06:16
C++中有byte类型吗?没见过

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

zw_7627 发表于 2019-6-24 12:25:58

armstrong 发表于 2019-6-18 15:54
不要频繁的调用原生函数,应该减少调用次数;而每次调用的原生函数应尽量多地做事。
每次平台调用,都是 ...

请教下关于C#线程同步的问题,我开了一个线程下载,需要在另一个接收线程里执行一个set();我在下载线程用了waitone,但实际是接收线程里的set()并未执行,请问下是什么原因?
页: [1]
查看完整版本: 请教C++中的一个结构体,怎么转到C#中