PInvoke проблема - PullRequest
       4

PInvoke проблема

1 голос
/ 19 июня 2011

Это сигнатура нативного метода c:

bool nativeMethod1
(unsigned char *arrayIn,
unsigned int arrayInSize,
unsigned char *arrayOut,
unsigned int *arrayOutSize);

Я понятия не имею, почему arrayOutSize - это указатель на unsigned int, а не на сам int.

Вот как я вызываю его из C #:

byte[] arrayIn= Encoding.UTF8.GetBytes(source);
uint arrayInSize = (uint)arrayIn.Length;
byte[] arrayOut = new byte[100];
uint[] arrayOutSize = new uint[1];
arrayOutSize[0] = (uint)arrayOut.Length;

fixed (byte* ptrIn = arrayIn, ptrOut = arrayOut)
{
    if (nativeMethod1(ptrIn, arrayInSize, ptrOut, arrayOutSize))
    {
        Console.WriteLine("True");
    }
    else
    {
        Console.WriteLine("False");
    }
}

и некоторый DllImport код

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]<br>
public unsafe static extern bool CreateCert2WithArrays(
        byte* data, uint dataSize,<br>
        byte* result, uint[] resultSize);

Согласно документации, нативный метод должен вернуть arrayOut выполняетсясо значениями, зависящими от arrayIn.Если его размер меньше необходимого, возвращается false.Верно иначе.Я понял, что в arrayOut нужно 850 элементов.Итак, когда я создаю новый массив byte [100], функция должна возвращать false, но всегда возвращает true.Почему?

Ответы [ 2 ]

4 голосов
/ 19 июня 2011

Вам не нужен небезопасный код и исправлено здесь.Стандартный маршаллер P / Invoke более чем соответствует задаче:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public static extern bool CreateCert2WithArrays(
    byte[] arrayIn, 
    uint arrayInSize,
    byte[] arrayOut,
    ref uint arrayOutSize
);

byte[] arrayIn = Encoding.UTF8.GetBytes(source);
uint arrayInSize = (uint)arrayIn.Length;
uint arrayOutSize = 0;

CreateCert2WithArrays(arrayIn, arrayInSize, null, ref arrayOutSize);
byte[] arrayOut = new byte[arrayOutSize];
CreateCert2WithArrays(arrayIn, arrayInSize, arrayOut, ref arrayOutSize);

Я не знаю точно, каков протокол функции, но это нормально для таких функций, чтобы иметь возможность получатьNULL если выходной массив имеет размер 0.

0 голосов
/ 19 июня 2011

Я не думаю, что массив - это то, что вы ищете.Это указатель на размер массива, а не указатель на массив размеров.Попробуйте это:

[DllImport(@"IcaCert.dll", EntryPoint = "CreateCert2", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern bool CreateCert2WithArrays(
byte* data, uint dataSize,
byte* result, ref uint resultSize);

byte[] arrayIn= Encoding.UTF8.GetBytes(source);

uint arrayInSize = (uint)arrayIn.Length;
byte[] arrayOut = new byte[100];
uint arrayOutSize = (uint)arrayOut.Length; 
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);
uint[] arrayOutSize = new uint[1];
arrayOut = new byte[(int)arrayOut];
CreateCert2WithArrays (arrayIn, (uint) arrayIn.Length, arrayOut, ref arrayOutSize);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...