2009-03-06 3 views
0

У меня есть следующая проблема. У меня есть библиотека C++, содержащий функциюПроблема с распределением данных C#

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); 
} 

I назовите его из приложения C# как

CS_dll w = new CS_dll(); 
byte [] msg = new byte [msg_size]; 
w.cs_send (msg, msg_size); 

Проблема заключается в том, что через некоторое время приложение C# выходит из строя с помощью SystemAccessViolationExcetpion. У вас есть идеи, где проблема?

Чтобы сделать его понятным: CAP-апликация может завершиться для некоторых типов ввода, в то время как для других он сбой, так что я не знаю, есть ли проблемы с вызовом конвенции, есть ли?

+0

отправить функцию: = cs_send (msg, msg_size)? – lakshmanaraj

+0

Какая строка кода вызывает AccessViolationException? –

+0

AV-файлы вызваны неуправляемым кодом. Вероятно, ваша функция cpp_send(). Код, который вы не опубликовали. –

ответ

0

Что такое "data.Length"? Просьба указать, где будут объявлены данные.

UPDATE: Это может быть также обратный вызов (делегат), который вы передаете в функцию, использует stdcall, в то время как неуправляемая функция ожидает соглашения о вызове cdecl.

1

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

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

+0

это зависит от того, сколько сообщений я пытаюсь отправить, он падает примерно с 100000, но отлично работает для всех. – 2009-03-06 11:39:19

+0

Возможно, C++-процесс не может выделить указатель на столько количества данных? Это сработало само по себе? – gbianchi

Смежные вопросы