我有以下问题。我有一个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可以完成某些类型的输入,而其他类型的输入崩溃,所以我不认为调用约定存在问题,是吗?
答案 0 :(得分:1)
您正在向仅接收3?
的函数发送5个参数编辑:感谢您修复代码。你说它失败了一些类型的数据。你能说出哪种类型?
答案 1 :(得分:0)
什么是'data.Length'?请提供声明数据的定义。
更新:它也可能是你传递给函数的回调(委托)正在使用stdcall,而非托管函数期望一个cdecl调用约定。