0

I am trying to convert c++ api example to c#. but I can not find the way of struct pointer in struct by the way struct has string types. Here is c++ structs and functions

struct AuthParam { char server_ip[32];  char username[50];  char password[50]; };
struct CameraInfo { int index;  char devicename[100];  char smallrtsp[1000];  char bigrtsp[1000]; };
struct SingleDevice { char deviceid[50];  char devicename[100];  int  flag_onuse;  int  cameralist_size;  CameraInfo* cameralist; };
struct DeviceList { int listsize;  SingleDevice* singledevicelist; };

typedef int (WINAPI capi_init)(void);
typedef int (WINAPI capi_disabled)(void);
typedef int (WINAPI capi_GetServerTimeCode)(char* server_ip, unsigned int* timecode);
typedef int (WINAPI GetDevicelist)(AuthParam auth_para, DeviceList* devicelist);

and this is my c# code but I can not find the way of defining struct pointer in struct I got " Error CS0208 Cannot take the address of, get the size of, or declare a pointer to a managed type ('Form1.CameraInfo')" error.

public struct AuthParam
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string server_ip;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string username;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string password;
        };

        [StructLayout(LayoutKind.Sequential)]
        public struct CameraInfo
        {
            public int index;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public string devicename;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)]
            public string smallrtsp;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1000)]
            public string bigrtsp;
        };

        [StructLayout(LayoutKind.Sequential)]
        public struct SingleDevice
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
            public string deviceid;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
            public string devicename;
            public int flag_onuse;
            public int cameralist_size;

            public CameraInfo *cameralist;
        };

        [StructLayout(LayoutKind.Sequential)]
        public unsafe struct DeviceList
        {
            public int listsize;
            public SingleDevice *singledevicelist;
        };

[DllImport("c:\\lib\\api_client.dll")] public static extern int capi_init();
        [DllImport("c:\\lib\\api_client.dll")] public static extern int capi_disabled();
        [DllImport("c:\\lib\\api_client.dll")] public static extern int capi_GetServerTimeCode(string ip, ref uint timecode);
        [DllImport("c:\\lib\\api_client.dll")] public static extern int GetDevicelist (AuthParam auth_para,ref  DeviceList devicelist);

is there any way to achieve this convertion?

1
  • Maybe that line should be public ref SingleDevice singledevice? Or you can use IntPtr for a pointer. Commented Dec 25, 2019 at 23:12

1 Answer 1

1

i think this error because of the different nature of c++ (un-managed code) and c# (managed code), so maybe using System.IntPtr as a pointer to your camera struct.

please consider this question here, and you can find about P/Invoke Interop Assistant which is an open source tool to convert your code from the un-managed code to a managed C# code. with a small blog article about C++/C# interoperability

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.