Porting C struct to C#

后端 未结 1 1051
感动是毒
感动是毒 2021-01-15 01:16

I\'m Porting C code to C# and I have some doubts.

Consider this structure:

typedef struct
{
  uint32_t       w;
  uint32_t       h;
  uint32_t                


        
相关标签:
1条回答
  • 2021-01-15 02:04

    Before we come to the delegates, I suspect that you are wrong to pack the struct. It's very unusual to do so. Only do that if you find the pack #pragma in the C code.

    The e_cc field is not a function pointer. It's just a void pointer. In C# that is IntPtr.

    The pl member is an array of 4 pointers. I'm not quite sure what they contain, but for sure you can marshal that like this:

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public IntPtr[] pl;
    

    That leaves you with manual intervention to populate the array, or read its contents. It's possible that could be done by the marshaller, but without knowing the semantics of the interop, I can't say how to do that.

    As for done, you should declare the delegate outside the struct. Like this:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void doneDelegate(IntPtr thisobj);
    

    Here I am assuming that the calling convention is cdecl since there's nothing in the C code to say otherwise.

    Putting it all together you have:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void doneFunc(IntPtr thisobj);
    
    [StructLayout(LayoutKind.Sequential)]
    public struct f_tt
    {
        public uint w;
        public uint h;
        public uint f_cc;
        public uint st;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public IntPtr[] pl;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public int[] strd;
        public doneDelegate done;
        public IntPtr e_cc;
        public uint rsrvd2;
        public uint rsrvd3;
    }
    
    0 讨论(0)
提交回复
热议问题