C# 클래스 인스턴스를 C 함수로 전달 할 때
C# 클래스 인스턴스를 C 프로그램으로 전달하려고 하는데
먼저 C에서 만든 구조체는 다음과 같습니다.
typedef unsigned char BYTE;
typedef BYTE * BYTE_BUFFER;
typedef wchar_t * LPWSTR;
typedef struct
{
size_t BytesDataCount; // BytesData의 원소 수
BYTE_BUFFER * BytesData; // 이진 데이터들에 대한 배열 (BYTE** 형)
size_t * BytesDataNCount; // BytesData[N] 에 있는 원소 수
size_t StringsCount; // Strings의 원소 수
LPWSTR * Strings;
size_t * StringsNCount; // Strings[N]의 글자 수
int Count[10];
} MyStruct, MYSTRUCT, *LPMYSTRUCT;
extern __declspec(dllexport) BOOL MyFunc001(IN LPMYSTRUCT __input, OUT LPMYSTRUCT __output);
아래는 C#에서 쓸 구조체입니다.
public class MyStruct
{
[MarshalAs(UnmanagedType.U4)]
private uint BytesDataCount;
[MarshalAs(...? 이 부분을 어떻게? )]
private List BytesData;
[MarshalAs(UnmanagedType.LPArray)] // 여기도 이렇게 LPArray 쓰는거 맞는지...?
private uint[] BytesDataNCount;
[MarshalAs(UnmanagedType.U4)]
private size_t StringsCount; // Strings의 원소 수
[MarshalAs(...? 역시 이 부분을 어떻게?)]
private List Strings;
[MarshalAs(UnmanagedType.LPArray)] // 여기도 이렇게 LPArray 쓰는거 맞는지...?
private size_t * StringsNCount; // Strings[N]의 글자 수
[MarshalAs(UnmanagedType.I4, SizeConst = 10)]
private int[] Count;
}
[DllImport("MyDll.DLL")]
public static extern bool MyFunc001(ref MyStruct __input, ref MyStruct __output);
BytesData, Strings 멤버에서 MarshalAs 속성의
타입을 어떻게 주어야 하는지 궁금합니다.
UnmanagedType.LPStruct, UnmanagedType.ByVal*** 등등 하나씩 다 해보고 있는 중인데
여기에서 아예 막히네요 ㅠㅠ
UnmanagedType.SafeArray보다는 그냥 이중 포인터 배열로 C 함수에 넘기고 싶은데
어떻게 해야 하나요?
댓글 달기