C#数据分配问题

时间:2009-03-06 11:01:37

标签: c# c++ free allocation

我有以下问题。我有一个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#aplication称为

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

问题是,经过一段时间后,C#aplication与SystemAccessViolationExcetpion崩溃。 你知道问题出在哪里吗?

为了更清楚:C#aaplication可以完成某些类型的输入,而其他类型的输入崩溃,所以我不认为调用约定存在问题,是吗?

2 个答案:

答案 0 :(得分:1)

您正在向仅接收3?

的函数发送5个参数

编辑:感谢您修复代码。你说它失败了一些类型的数据。你能说出哪种类型?

答案 1 :(得分:0)

什么是'data.Length'?请提供声明数据的定义。

更新:它也可能是你传递给函数的回调(委托)正在使用stdcall,而非托管函数期望一个cdecl调用约定。