首页 新闻 会员 周边

C++方法转换C#数据类型问题

0
悬赏园豆:10 [已解决问题] 解决于 2017-02-21 16:16
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#转换的类型不对,谢谢高手解答

问题补充:

c++调用成功,可以获得char*数据,但是c#中调用报错

diorlv2010的主页 diorlv2010 | 初学一级 | 园豆:188
提问于:2015-02-04 19:47
< >
分享
最佳答案
0

问题应该是在  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即可。

收获园豆:10
天方 | 大侠五级 |园豆:5407 | 2015-02-08 13:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册