C#调用dll,使用intPtr接收char*返回值不一致 5C

在C#中调用C的dll,遇到char* 使用 intPtr接收,返回值与C中char 指针不一致

C结构体

    typedef struct
    {

            BYTE ErrCode;   
            int* errstring;

    } ERRPARAMS;

函数

    BYTE DSCUDAPICALL dscGetLastError(ERRPARAMS* errparams);

C#结构体

    [StructLayout(LayoutKind.Sequential)]
    public struct ERRPARAMS
    {
        public byte ErrCode;
        public IntPtr errstring;
    }

函数

    [DllImport("dscud.dll", EntryPoint = "dscGetLastError", CharSet = CharSet.Unicode, SetLastError = false, CallingConvention = CallingConvention.Cdecl)]
    extern unsafe public static byte dscGetLastError(ERRPARAMS* errparams);

执行结果:
在C中 ErrCode是5 errstring是0x1007eb80 可以转换成字符串

在C#中 ErrCode是5 errstring是0x00000010 使用Marshal.PtrToStringAnsi转换为空,不是想要的地址

将intPtr改成string/String/StringBuilder/char[]都试过了,函数会报内存异常的错误。

且大神解答,非常感谢。

2个回答

extern public static IntPtr dscGetErrorString(byte error_code);
应该是
extern unsafe public static IntPtr dscGetErrorString(ERRPARAMS * param);
将程序集设置为允许不安全代码

u011124078
刘奇1993 感谢回答,我试了你的方法,返回的依然是0x00000010。我怀疑是否和C与C#管理方式不同有关,但现在想要得到正确的string不知怎么做
大约一年之前 回复

别人的DLL程序 里有2个不同的方法

u011124078
刘奇1993 dll文件虽然看不到,但不会有两个不同方法
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐