我正在尝试从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);
还有一个调用,一旦完成,就释放内存
答案 0 :(得分:0)
获得IntPtr
后,应使用PtrToStringAuto
或PtrToStringAnsi
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); }
感谢您的帮助。