Как я могу передать указатель на массив с помощью p/invoke в C#?

Я думаю, вы смешиваете код из двух версий. После создания Presto Software Foundation (см. Объявление: https://prweb.com/releases/prweb16070792.htm ) Presto переехала в свой новый дом под https://github.org / prestosql / presto и https://prestosql.io , и весь код был переупакован.

Если у вас уже есть код под старой версией, обратитесь к этому руководству, чтобы узнать, как его перенести: https://github.com/prestosql/presto/wiki/Migration

21
задан GEOCHET 14 November 2008 в 02:34
поделиться

3 ответа

Самый легкий способ передать массив байтов состоит в том, чтобы объявить параметр в Вашем операторе импорта как массив байтов.

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true]
public extern static void Func(byte[]);

byte[] ar = new byte[1000];
Func(ar);

необходимо также быть в состоянии объявить параметр как IntPtr и Маршал данные вручную.

[DllImport EntryPoint="func" CharSet=CharSet.Auto, SetLastError=true]
public extern static void Func(IntPtr p);

byte[] ar = new byte[1000];
IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(byte)) * ar.Length);
Marshal.Copy(ar, 0, p, ar.Length);
Func(p);
Marshal.FreeHGlobal(p);
34
ответ дан 29 November 2019 в 20:25
поделиться

Можно использовать небезопасный код:

unsafe 
{
     fixed(byte* pByte = byteArray)
     IntPtr intPtr = new IntPtr((void *) pByte);
     Func(intPtr);
}

, Если необходимо использовать безопасный код, можно использовать несколько приемов:

IntPtr intPtr = Marshal.AllocHGlobal(Marshal.SizeOf(byteArray));
Marshal.Copy(byteArray, 0, intPtr, Marshal.SizeOf(byteArray));

Func(intPtr);

Marshal.FreeHGlobal(intPtr);

Однако безопасный код будет медленным, по моему скромному мнению.

7
ответ дан 29 November 2019 в 20:25
поделиться

Вот соответствующая подпись для собственной функции.

[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Func")]
public static extern  void Func(System.IntPtr bytes) ;
3
ответ дан 29 November 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: