У меня есть C++ dll, который используется для печати карточек (удостоверения личности). Моя реализация выполнена с использованием С#.Net. Я использовал следующий код для вызова DLL C++.
[DllImport(@"J230i.dll",CallingConvention = CallingConvention.Cdecl,SetLastError=true)]
public static extern int N_PrintJobStatus(ref int[] nPrtintjobStatus);
int[] pJob = {0,0,0,0,0,0,0,0} ;
ret = N_PrintJobStatus( ref pJob);
Подпись метода N_PrintJobStatus, приведенная ниже
N_PrintJobStatus(int *pJobStatus )
После вызова метода он дает следующую ошибку
Вызов функции PInvoke '********! *********. FrmCardPrint :: N_PrintJobStatus' имеет несбалансированный стек. Вероятно, это связано с тем, что управляемая подпись PInvoke не соответствует неуправляемой целевой сигнатуре. Убедитесь, что соглашение о вызове и параметры сигнатуры PInvoke соответствуют целевой неуправляемой подписи.
Как я могу исправить эту проблему?
Спасибо.....
Ваш перевод неверен. Int array, int*
не отображается в ref int[]
. Последний будет сортироваться как int**
. Вам нужно использовать int[]
.
[DllImport(@"J230i.dll", CallingConvention = CallingConvention.Cdecl,
SetLastError = true)]
public static extern int N_PrintJobStatus(int[] nPrtintjobStatus);
Выделите массив перед вызовом функции. Предположительно, у вас есть какой-то способ определить, как долго это должно быть. В ее нынешнем виде эта функция выглядит как переполнение буфера в ожидании. Как функция знает, как долго будет массив, и поэтому предпринимать шаги, чтобы избежать написания за ее пределами?
Не ясно, что это единственная проблема. Мы не можем быть уверены, что тип возврата действительно является int
. Или, что конвенция вызова - cdecl. Или что функция действительно вызывает SetLastError
.