Import struktury w strukturze z c++

0

Witam,
Jak zaimportować do C# poniższą strukturę?

typedef struct pjsua_call_info
{
    pjsua_call_id	id;
    pjsip_role_e	role;
    pjsua_acc_id	acc_id;
    pj_str_t	local_info;
    pj_str_t	local_contact;
    pj_str_t	remote_info;
    pj_str_t	remote_contact;
    pj_str_t	call_id;
    pjsip_inv_state	state;
    pj_str_t	state_text;
    pjsip_status_code	last_status;
    pj_str_t	last_status_text;
    pjsua_call_media_status	media_status;
    pjmedia_dir	media_dir;
    pjsua_conf_port_id	conf_slot;
    pj_time_val	connect_duration;
    pj_time_val	total_duration;
    struct {
	char	local_info[128];
	char	local_contact[128];
	char	remote_info[128];
	char	remote_contact[128];
	char	call_id[128];
	char	last_status_text[128];
    } buf_;

} pjsua_call_info;

w c# mam natomiast takie cos:

[StructLayout(LayoutKind.Sequential)]
    public struct pjsua_call_info
    {

        public int id;
        public pjsip_role_e role;
        public int acc_id;
        public pj_str_t local_info;
        public pj_str_t local_contact;
        public pj_str_t remote_info;
        public pj_str_t remote_contact;
        public pj_str_t call_id;
        public pjsip_inv_state state;
        public pj_str_t state_text;
        public pjsip_status_code last_status;
        public pj_str_t last_status_text;
        public pjsua_call_media_status media_status;
        public pjmedia_dir media_dir;
        public int conf_slot;
        public pj_time_val connect_duration;
        public pj_time_val total_duration;

        [StructLayout(LayoutKind.Sequential)]
        public struct buf_
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string local_info;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string local_contact;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string remote_info;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string remote_contact;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string call_id;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            public string last_status_text;
        }

    } 

I chodzi mi konkretnie o ta wewnętrzną strukturę buf_.
Funkcja wywołująca wygląda następująco :

[DllImport(PJSIP_DLL, EntryPoint = "pjsua_call_get_info")]
public static extern int pjsua_call_get_info(int call_id, out pjsua_call_info info); 
pjsua_call_info callInfo;
pjsua_call_get_info(session, out callInfo);

Po jej wywołaniu pojawia się (albo czasem się nie pojawia) wyjątek: Zgłoszono wyjątek typu 'System.ExecutionEngineException'.
Cały opis struktury dostępny jest pod adresem: http://www.pjsip.org/pjsip/docs/html/structpjsua__call__info.htm ps. Chciałem zrobić z tego linka, ale coś źle reaguje na "__".

0

czy sizeof(pjsua_call_info) w C i Marshal.SizeOf(typeof(pjsua_call_info)) w C# zwracają tyle samo?

0

Niestety nie...
sizeof(pjsua_call_info); = 872
Marshal.SizeOf(typeof(pjsua_call_info)); = 104

z czego wynika ta różnica? generalnie po pojawieniu się błędu w tej zimportowanej strukturce mam już umieszczone dane o które mi chodzi

0

872-104=768=6*128. Już wiesz co może być błędem?

0

buf_ nie jest w ogóle polem, tylko zagnieżdżonym typem.

0
Azarien napisał(a)

buf_ nie jest w ogóle polem, tylko zagnieżdżonym typem.

buf_ jest polem, instancją struktury anonimowej

0
        [StructLayout(LayoutKind.Sequential)] // definicja typu
        public struct buf_t 
        {
                bla bla bla
        }

        public buf_t buf_; // pole tego typu
0

Dzięki,

public buft_ buf_; 

podziałało i jest super:) dziękuje

1 użytkowników online, w tym zalogowanych: 0, gości: 1