나는 P/Invoke와 함께 C#을 사용하여 DLL 메서드에 액세스합니다.C#에서 배열 멤버가있는 마샬 러 구조체
[StructLayout(LayoutKind.Sequential)]
public class USER_LIST
{
public uint NumUsers;
[MarshalAs(UnmanagedType.ByValArray)]
public USER_LIST_ITEM [] List;
}
[StructLayout(LayoutKind.Sequential)]
public class USER_LIST_ITEM
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string name;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string address;
};
하지만 오류가 다음
typedef struct user_list {
unsigned short NumUsers;
USER_LIST_ITEM List[VARLEN];
} USER_LIST
typedef struct user_list_item {
char name[260];
unsigned char address[256];
} USER_LIST_ITEM
내가했던 구조체의 레이아웃입니다 :
[DllImport("userManager.dll")]
static extern int GetUsers(out IntPtr userList);
기존 구조체 : 방법의 정의는 다음과 같다 언 마샬하려고 할 때 :
USER_LIST userList = new USER_LIST();
// Prepare pointer
IntPtr uList = Marshal.AllocHGlobal(Marshal.SizeOf(userList));
Marshal.StructureToPtr(userList, uList, false);
result = GetUsers(out uList);
Marshal.PtrToStructure(uList, userList); <--
런타임에 치명적인 오류가 발생했습니다. 오류의 주소는 0x79f82af6, 스레드 0x464에있었습니다. 오류 코드는 0xc0000005입니다. 이 오류는 CLR 또는 안전하지 않거나 확인할 수없는 사용자 코드 부분의 버그 일 수 있습니다. 이 버그의 일반적인 출처에는 스택을 손상시킬 수있는 COM-interop 또는 PInvoke의 사용자 마샬링 오류가 포함됩니다.
NumUsers 속성이 올바르지 만 배열을 비 정렬화할 때 오류가 발생하는 것 같습니다. 이견있는 사람?
원본 GetUsers 기능의 서명은 무엇입니까? – dtb
왜 공간을 할당하고 포인터를 준비합니까? 'out uList'는'uList'가 덮어 씌워 질 것이지만 네이티브 코드에 값이 전달되지 않는다는 것을 의미합니다. – dtb
원래 서명 : 상태 UMAPI받는 사람 ( OUT USER_LIST ** userList ); – Sergi