Я думаю, вы смешиваете код из двух версий. После создания 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
Самый легкий способ передать массив байтов состоит в том, чтобы объявить параметр в Вашем операторе импорта как массив байтов.
[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);
Можно использовать небезопасный код:
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);
Однако безопасный код будет медленным, по моему скромному мнению.
Вот соответствующая подпись для собственной функции.
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="Func")]
public static extern void Func(System.IntPtr bytes) ;