Невозможно выполнить маршализацию 'возвращаемого значения': недопустимая комбинация управляемого / неуправляемого типа

У меня есть эта функция в неуправляемой библиотеке, и я хочу вызвать ее в C#:

unsigned char __stdcall InitDev(unsigned char comport, long BaudRate)

и это в C#

[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("*.dll", CallingConvention = CallingConvention.Cdecl,CharSet =CharSet.Auto)]
public static extern byte[] InitDev(byte[] comport, [Out]long BaudRate);

но когда я вызываю эту функцию в C#, я получаю следующую ошибку

Msgstr"Невозможно маршалировать 'возвращаемое значение': недопустимая комбинация управляемого / неуправляемого типа."

string COM = "COM3";
byte[] ptr = new byte[1];
try
{
    ptr = InitDev(Encoding.ASCII.GetBytes(COM), 9600);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

Я новичок в этом, если дать небольшое руководство, я смогу решить эту проблему

введите описание изображения здесь

1 ответ

Решение

Предполагая, что ваш родной вызов что-то вроде unsigned char* InitDef(unsigned char*, long long &baudRate) тогда вы, вероятно, хотите использовать IntPtr на месте вашего unsigned char*, Но сначала, поскольку это управляемое / неуправляемое микширование, вы должны выделить byte[] буфер для ввода и вывода:

byte[] pInBuffer = Encoding.ASCII.GetBytes("COM3");
// allocate unmanaged memory
IntPtr inputBuffer = Marshal.AllocHGlobal(pInBuffer.Length * sizeof(byte));
Marshal.Copy(pInBuffer, 0, inputBuffer, pInBuffer.Length);

// now your inputBuffer contains a native pointer to the `unsigned char*`
// and since your function returns a new pointer to some `unsigned char*`
// just retrieve it to IntPtr
IntPtr result = InitDev(inputBuffer, 9600);

// free your allocated memory
Marshal.FreeHGlobal(inputBuffer);

На этом этапе ваш result содержит значение, возвращаемое из InitDev,


новое определение InitDev функция

[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("*.dll", CallingConvention = CallingConvention.Cdecl,CharSet =CharSet.Auto)]
public static extern IntPtr InitDev(IntPtr comport, [Out] long BaudRate);

Все необходимые звонки вы можете найти на этой странице msdn


РЕДАКТИРОВАТЬ:
Так как ваш родной вызов выглядит так: extern unsigned char __stdcall InitDev(unsigned char comport,long BaudRate);
Я предполагаю, что первый параметр - это просто последняя цифра (индекс) вашего "COMn" так как unsigned char Наименьшее возможное значение равно 0, а наименьший индекс COM может быть 0.

Попробуйте использовать этот фрагмент:

[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("*.dll", CallingConvention = CallingConvention.Cdecl,CharSet =CharSet.Auto)]
public static extern byte InitDev(byte comport, long BaudRate);

А потом назовите это так:

byte comIdx = 3;
byte result = InitDev(comIdx, 9600);
// byte should yield correct result now
Другие вопросы по тегам