日期:2014-05-18  浏览次数:21068 次

c# 调用C++dll内的函数 C++结构体指针对应C#什么类型
1.设备为CAN总线
2.使用产家提供的DLL操作CAN总线
3.其DLL是c++写的

dll内定义
 
C/C++ code

typedef struct _CANFRAME {
        UCHAR    mFrame[10];
    }CANFRAME,*PCANFRAME;



dll内的函数:
BOOL _stdcall Pci6621_Send(int mDev,int mPort,PCANFRAME pSendFrame);
用途:
  用于PCI6621通讯端口的发送数据帧;
返回参数:
返回值为BOOL 返回TRUE表示发送成功,FALSE表示发送失败;
调用参数:
mDev 32位int 设备序号。取值为范围0-3; 现在填0
nPort 32位int 端口序号。取值为范围0-1; 现在填0
pSendFrame 数据帧指针 这里需要什么类型数据



------解决方案--------------------
new byte[10]就行
------解决方案--------------------
C# code
[DllImport("你的DLL路径")]
public static extern int Pci6621_Send(int mDev, int mPort, byte[] pSendFrame);

------解决方案--------------------
需要一个CANFRAME结构的指针(引用)
C# code
        [StructLayout(LayoutKind.Sequential)]
        public struct CANFRAME
        {
            [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 10)]
            public byte[] mFrame;
        }

        public class LibWrap
        {
            [DllImport("MyDll.dll")]
            public static extern bool Pci6621_Send([In] Int32 mDev, [In] Int32 mPort, ref CANFRAME pSendFrame);
        }


        static void Main()
        {
            CANFRAME sendFrame = new CANFRAME();
            sendFrame.mFrame = new byte[10];
            //sendFrame.mFrame[0] = 0x01;
            //...

            bool bSuccess = LibWrap.Pci6621_Send(0, 0, ref sendFrame);
        }

------解决方案--------------------
楼上办法可行,给你一个更全面的:

http://blog.csdn.net/sdl2005lyx/article/details/6801113
------解决方案--------------------
ref 结构体名
结构体自己定义