I am completely new to C # and need help transforming the structure of C ++ into C #. The C ++ structure is defined as:
#define QUE_ADDR_BUF_LENGTH 50 #define QUE_POST_BUF_LENGTH 11 typedef struct { const WCHAR *streetAddress; const WCHAR *city; const WCHAR *state; const WCHAR *country; const WCHAR *postalCode; } QueSelectAddressType; typedef struct { WCHAR streetAddress[QUE_ADDR_BUF_LENGTH + 1]; WCHAR city[QUE_ADDR_BUF_LENGTH + 1]; WCHAR state[QUE_ADDR_BUF_LENGTH + 1]; WCHAR country[QUE_ADDR_BUF_LENGTH + 1]; WCHAR postalCode[QUE_POST_BUF_LENGTH + 1]; } QueAddressType;
I canβt make changes to the C ++ structure because they are defined by the API I'm trying to interact with. Any help would be appreciated.
EDIT: Here is the additional information, the function in the DLL that I am trying to call is declared as follows:
#ifdef QUEAPI_EXPORTS #define QueAPIExport __declspec(dllexport) #elif defined QUEAPI_SERVER #define QueAPIExport #else #define QueAPIExport __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif typedef uint32 QuePointHandle; QueAPIExport QueErrT16 QueCreatePointFromAddress ( QueSelectAddressType* addr,
This is how I defined DllImport:
[DllImport("QueAPI.DLL", EntryPoint = "QueCreatePointFromAddress")] public static unsafe extern QueTypesnConst.QueErrT16 QueCreatePointFromAddress(QueTypesnConst.QueSelectAddressType *address, uint *point);
EDIT2: The following code blocks were the solution to the problem: For structures:
[StructLayout(LayoutKind.Sequential)] public struct QueSelectAddressType { [MarshalAsAttribute(UnmanagedType.LPWStr)] public string streetAddress; [MarshalAsAttribute(UnmanagedType.LPWStr)] public string city; [MarshalAsAttribute(UnmanagedType.LPWStr)] public string state; [MarshalAsAttribute(UnmanagedType.LPWStr)] public string country; [MarshalAsAttribute(UnmanagedType.LPWStr)] public string postalCode; }; [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)] public struct QueAddressType { [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=51)] public string streetAddress; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 51)] public string city; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 51)] public string state; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 51)] public string country; [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 12)] public string postalCode; };
For DllImport:
[DllImport("QueAPI.DLL", EntryPoint = "QueCreatePointFromAddress")] public static extern QueTypesnConst.QueErrT16 QueCreatePointFromAddress(ref QueTypesnConst.QueSelectAddressType address, ref uint point);
user268877
source share