从c#项目System.AccessViolationException调用c ++ char *

时间:2018-11-05 14:49:35

标签: c# c++ interop

我正在尝试从c#项目中调用c ++库方法,但没有成功。我总是遇到同样的错误。

System.AccessViolationException: 'Attempted to read or write protected
memory. This is often an indication that other memory is corrupt.'

c ++方法签名如下所示

int __stdcall getErrorMessage(int errorId, char *&errorMessage);

到目前为止,我已经尝试了每种组合,但似乎无济于事。

[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage", 
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, ref StringBuilder errorMessage);

[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage",
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, ref IntPtr errorMessage);


[DllImportAttribute("Lib.dll", EntryPoint = "getErrorMessage",
CallingConvention = CallingConvention.StdCall)] 
public static extern int getErrorMessage(int errorId, IntPtr errorMessage);

任何帮助将不胜感激。

编辑

我称呼它的方式如下

  

var ptr = new IntPtr();

     

var ret = NativeMethods.getErrorMessage(number,ref ptr);

还有一个调用,一旦完成,就释放内存

2 个答案:

答案 0 :(得分:0)

获得IntPtr后,应使用PtrToStringAutoPtrToStringAnsi

将其转换为string

答案 1 :(得分:0)

终于可以正常工作了,当我们尝试使用任意错误代码查询方法时,问题就如Hans Passant所述发生了。

  

工作代码。

var ptr = new IntPtr();

var ret = NativeMethods.getErrorMessage(code, ref ptr);

        if (ptr != IntPtr.Zero)
        {
            message = Marshal.PtrToStringAnsi(ptr);
            NativeMethods.freePointer(ref ptr);
        }

感谢您的帮助。