0

我有以下问题。我有一个 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# aaplication 可以完成某些类型的输入,而其他类型的输入会崩溃,所以我不认为调用约定有问题,是吗?

4

2 回答 2

1

您要向仅接收 3 个的函数发送 5 个参数?

编辑:感谢您修复代码。你说它因某些类型的数据而失败。能说一下是什么类型吗?

于 2009-03-06T11:16:41.250 回答
0

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

更新:也可能是您传递给函数的回调(委托)正在使用 stdcall,而非托管函数需要 cdecl 调用约定。

于 2009-03-06T11:12:03.570 回答