преобразовать структуру в указатель на символ в c #

Ниже приведен фрагмент кода, написанный на c ++, как я могу преобразовать его в c #. Если вы проверите функцию pams_get_msgw, первый параметр имеет значение (char *), как я могу передать то же самое в c #.

                struct
{
short m_nStatus;
short m_nReg_Id;
short m_nNumber_Reg;
} oRegReply;

short nBufSize = sizeof(oRegReply);
q_address   oSenderQueue;
nMsgType = MSG_TYPE_SBS_REG_REPLY;
cPriority = 0;
lTimeout = 300; // 30 seconds

//Wait for reply telegram from SBS server
lStatus = pams_get_msgw((char *) &oRegReply, &cPriority, &oSenderQueue,
&nMsgClass, &nMsgType, &nBufSize, &nMsgLen,
&lTimeout, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);

Моя декларация c # для pams_get_msgw функция такая

  [DllImport("DmqCl32.dll")]
public static extern int pams_get_msgw(StringBuilder msg_area, string priority, out q_address source,
out short clas, out short type,
ref short msg_area_len, out short len_data, ref int timeout,
ref int sel_filter, out PSB psb, out ShowBuffer show_buffer,
ref int show_buffer_len, ref int large_area_len, out int large_size,
[MarshalAs(UnmanagedType.LPStr)] string nullarg_3);

и фактическое объявление C ++

typedef long (CALLBACK* PAMSGETMSGW)(char *,char *,q_address *, short *, short *, short *,
short *, long *, long *, struct PSB *,
struct show_buffer *, long *, char *, char *, char * );

Как я могу передать структуру в первый аргумент, как это делается в C ++
?

0

Решение

Вы должны быть в состоянии объявить вашу структуру в C # как учебный класс вместо структуры, а затем вы можете просто передать его через P / Invoke без использования ref ключевое слово.

То, что происходит, — то, что код C настолько древний, что он использует char* где следует использовать byte*,

В любом случае, маршалинг по умолчанию для P / Invoke в большинстве случаев обрабатывает закрепление и передачу ссылок на объекты, поэтому он, вероятно, сработает, если вы просто передадите объект класса. (Многие структуры C ++ могут быть объявлены как классы на стороне C #, что может упростить P / Invoke.)

Вы не показываете декларацию C для pams_get_msgw() но похоже, что вы также должны использовать Marshal.Sizeof(RegReply) для значения msg_area_len (где RegReply ваш класс C # для C oRegReply структура).

Кстати: вам нужна помощь с объявлением версии C # oRegReply структура?

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]