FIX_API_EXPORT BOOL 方法名( HANDLE_SESSION sess, char *out, int &outlen, long row );
转换为C#的我是这样写的
[DllImport("FixApi.dll", CallingConvention = CallingConvention.Cdecl)] public static extern bool 方法名(HANDLE_SESSION sess, [MarshalAs(UnmanagedType.LPStr, SizeConst = 1024)]StringBuilder data, ref int outlen, Int32 row);
用C#调用此方法报这个错误
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
但是没有c++源码,这个应该怎样调试,谢谢,还是我C#转换的类型不对,谢谢高手解答
问题应该是在 char *out 上,从声明上来看,貌似是在函数外面申请的缓冲区,而是在函数里面给赋值。 可以参考 http://www.codeproject.com/Articles/138614/Advanced-Topics-in-PInvoke-String-Marshaling 这篇文章来试一下。
对于函数
void my_function(char *data);
将其封装为如下形式。
private class imp { [DllImport("mydllname")] private extern static unsafe my_function(IntPtr data); } public unsafe void my_function(out string data) { IntPtr buffer = (IntPtr)stackalloc byte[4000]; imp.my_function(buffer); data = Marshal.PtrToStringAnsi(buffer); }
另外,无法调试这个问题其实比较好解决,自己写一个C++的DLL,保持一样的声明接口,模拟一下这个功能,用PInvoke调用你写的DLL即可。