I have a C function Do_Something(struct_A* obj) which I want to call from C#.
This take struct_A pointer as IN parameter. struct_A has array of struct_B whose size is variable.
‘C’ Structures and function are as below.
/*
C Code -------->
*/
struct struct_B
{
int m_num; /* Number of items in m_dataArray */
int *m_dataArray; /* size is m_num*/
};
struct struct_A
{
int type ; /* Some integer value*/
struct_B* m_array_Of_B; /*Pointer to struct_B structure*/
};
extern __declspec(dllexport) int Do_Something(struct_A* obj);
//<---------------
I have wrapped these structures in C# and I want to call Do_Something() from C# program.
//C# Code -------->//C# Code -------->
[Serializable]
public struct STRUCT_B
{
public int m_num;
public int [] m_dataArray;
};
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
internal struct _STRUCT_B
{
public int m_num;
public unsafe int * m_dataArray;
};
[Serializable]
public struct STRUCT_A
{
public int type;
public STRUCT_B [] m_array_Of_B;
};
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct _STRUCT_A
{
public int type;
public IntPtr m_array_Of_B;
};
[DllImport("libTest.dll",CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi,EntryPoint="Do_Something")]
internal static extern int _DoSomething
(
ref _STRUCT_A obj
};
public unsafe void DoSomething
(
ref STRUCT_A obj /* pointer to struct method_list */
)
{
LOCAL_STRUCT_A=new _STRUCT_A();
LOCAL_dataSize = Marshal.SizeOf( typeof(STRUCT_B ) );
LOCAL_STRUCT_A.m_array_Of_B=Marshal.AllocHGlobal(LOCAL_dataSize*obj.m_array_Of_B.Length);
byte *LOCAL_run = (byte *)IntPtr.Zero;
LOCAL_run = (byte *)(LOCAL_STRUCT_A.m_array_Of_B);
for( int LOCAL_i = 0; LOCAL_i < obj.m_array_Of_B.Length; LOCAL_i++ )
{
Marshal.StructureToPtr(obj. m_array_Of_B[LOCAL_i], (IntPtr)LOCAL_run, false);
LOCAL_run = LOCAL_run + LOCAL_dataSize;
}
_DoSomething(LOCAL_STRUCT_A);
}
//C# Code <--------
I am using Marshal.StructureToPtr to convert m_array_Of_B in STRUCT_A to IntPtr in _STRUCT_A and pass _STRUCT_A to DoSomething().
Everything works fine but when I debug in ‘C’ Dll values in m_dataArray in STRUCT_B are grabage.
Which means Marshal.StructureToPtr() converts STRUCT_B into IntPtr but it fails to preserve m_array_Of_B in STRUCT_B.
Has anybody face such a problem…………… Pleae reply as soon as possible.
Also it would be nice help if you could give me pointers in marshalling structures.
Thanks,
Jay