Help me convert C ++ structure to C #

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, // in: Address data to search on. QuePointHandle* point // out: Handle to selected point. Must be closed with QueClosePoint. ); 

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); 
+4
source share
2 answers

Try the following definition

 public partial class NativeConstants { /// QUE_ADDR_BUF_LENGTH -> 50 public const int QUE_ADDR_BUF_LENGTH = 50; /// QUE_POST_BUF_LENGTH -> 11 public const int QUE_POST_BUF_LENGTH = 11; } [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct QueSelectAddressType { /// WCHAR* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] public string streetAddress; /// WCHAR* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] public string city; /// WCHAR* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] public string state; /// WCHAR* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] public string country; /// WCHAR* [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] public string postalCode; } [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet=System.Runtime.InteropServices.CharSet.Unicode)] public struct QueAddressType { /// WCHAR[51] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=51)] public string streetAddress; /// WCHAR[51] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=51)] public string city; /// WCHAR[51] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=51)] public string state; /// WCHAR[51] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=51)] public string country; /// WCHAR[12] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValTStr, SizeConst=12)] public string postalCode; } 
+7
source
 public struct QueSelectAddressType { public readonly string StreetAddress; public readonly string City; public readonly string State; public readonly string Country; public readonly string PostalCode; public QueSelectAddressType(string street, string city, string state, string country, string code) { this.StreetAddress = street; this.City = city; this.State = state; this.Country = country; this.PostalCode = code; } } public struct QueAddressType { char[] streetAddress = new char[QUE_ADDR_BUF_LENGTH + 1]; char[] city = new char[QUE_ADDR_BUF_LENGTH + 1]; char[] state = new char[QUE_ADDR_BUF_LENGTH + 1]; char[] country = new char[QUE_ADDR_BUF_LENGTH + 1]; char[] postalCode = new char[QUE_POST_BUF_LENGTH + 1]; } 
0
source

Source: https://habr.com/ru/post/1300667/


All Articles