C # проблема размещения данных - PullRequest
0 голосов
/ 06 марта 2009

У меня следующая проблема. У меня есть 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 # может завершиться для некоторых типов ввода, в то время как для других происходит сбой, так что я не думаю, что есть проблема с соглашением о вызовах, есть?

Ответы [ 2 ]

1 голос
/ 06 марта 2009

Вы отправляете 5 параметров в функцию, которая получает только 3?

Редактировать: Спасибо за исправление кода. Вы говорите, что это терпит неудачу с некоторыми типами данных. Вы можете сказать, какой тип?

0 голосов
/ 06 марта 2009

Что такое «data.Length»? Пожалуйста, предоставьте определение, где данные объявлены.

ОБНОВЛЕНИЕ: Это также может быть обратный вызов (делегат), который вы передаете в функцию, используя stdcall, в то время как неуправляемая функция ожидает соглашения о вызовах cdecl.

...