无法获取结构C#的指针

时间:2019-01-17 07:26:53

标签: c# c++ dll

场景就像有GUI和Dll,GUI在C#(WPF)中,并且正在使用c ++ Dll,dll需要在GUI中创建结构的结构指针来处理命令。

在Dll结构中具有固定大小的数组,因此在GUI中也创建了相同的大小。

C ++结构

struct _TempData
{
    Int32 iOnFly_StepCalib;
    Int32 iOnFly_BiDiCalib;
    UNIT Unit;
    byte uiPrintDirection;

    Int16 siStep_Feed[20];
};

所以在GUI(C#)中,结构就像...

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct _TempData
{
    public Int32 iOnFly_StepCalib;
    public Int32 iOnFly_BiDiCalib;
    public UNIT Unit;
    public byte uiPrintDirection;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public Int16[] siStep_Feed;
};

和我用于获取此结构指针的c#代码在这里

[DllImport("Dll12.dll")]
public static extern UIntPtr sendMessageToHSM(Int32 MSG, IntPtr CmdStruct);
static void Main(string[] args)
{
    _TempData tempData;
    tempData.iOnFly_BiDiCalib = 1;
    tempData.iOnFly_StepCalib = 2;
    tempData.uiPrintDirection = 1;
    tempData.Unit = UNIT.INCH;

    unsafe
    {
        void* tempdata1 = &tempData;
        sendMessageToHSM((int)HSM_COMMANDS.HSM_GUI_PC_UPDATE_STEP_CALIB, (IntPtr)tempdata1 );
    }
}

此错误正在显示...

Error   CS0208  Cannot take the address of, get the size of, or declare a pointer to a managed type ('_TempData')   

在结构中注释此行

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public Int16[] siStep_Feed;

然后代码运行正常。

我是C#的新手。

任何帮助将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码中有很多错误,这里也没有使用unsafe关键字

我相信您可能正在寻找的

// get the size
int size = Marshal.SizeOf(tempData);

// Create some unmanaged memory 
IntPtr ptr = Marshal.AllocHGlobal(size);

// marshal the structure to pointer
Marshal.StructureToPtr(tempData, ptr, false);

// call the funky api
sendMessageToHSM((int)HSM_COMMANDS.HSM_GUI_PC_UPDATE_STEP_CALIB, ptr);

// get the result if there is any
_TempData tempData2 = (_TempData)Marshal.PtrToStructure(ptr, typeof(_TempData));

// clean up the memory
Marshal.FreeHGlobal(ptr);

在C#中,我们也不用下划线来命名类型