У меня следующая проблема. У меня есть C ++ dll, содержащая функцию
void cpp_send (void *data_, size_t size_, free_fn *ffn_)
{
//sends data
}
тогда у меня есть C # dll, у которого есть класс
public class CS_dll : IDisposable
{
void cs_send (void *data)
{
IntPtr ptr = Marshal.AllocHGlobal (data.Length);
Marshal.Copy (data, 0, ptr, data.Length);
try
{
cpp_send (ptr,
Convert.ToUInt32 (data.Length), Free);
}
catch
{
Free (ptr);
}
}
// Функция Free () выглядит следующим образом:
public static void Free (IntPtr ptr)
{
Marshal.FreeHGlobal (ptr);
}
Я называю это из приложения C # как
CS_dll w = new CS_dll();
byte [] msg = new byte [msg_size];
w.cs_send (msg, msg_size);
Проблема в том, что через некоторое время приложение C # аварийно завершает работу с SystemAccessViolationExcetpion.
У вас есть идеи, где проблема?
Чтобы сделать это более понятным: аппликация C # может завершиться для некоторых типов ввода, в то время как для других происходит сбой, так что я не думаю, что есть проблема с соглашением о вызовах, есть?