我使用 PInvoke 从 c# 代码访问 C++ 库。但我在使用以下功能时遇到问题:
UINT32 myfunc(IN char * var1, IN UINT32 var2, INOUT UINT16 * var3, OUT UINT8 * var4)
文档说:
返回参数为错误码
var1 是一个字符串
var2 是一个整数
var3 是一个指向整数的指针(该值将是 var4 的大小,该值将由函数更改)
var4 是指向将由函数填充的缓冲区的指针
当我使用
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int myfunc(string var1, int var2, out int var3,
out byte[] var4);
该函数给出以下异常:
托管调试助手“FatalExecutionEngineError”在“C:\Users...\Documents\Projects...\bin\Debug...vshost.exe”中检测到问题。
附加信息:运行时遇到致命错误。错误地址位于线程 0x2edc 上的 0x74292e44。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。
如果有这个异常的处理程序,程序可以安全地继续。
我尝试使用参数来查看是否可以得到任何东西,并更改了字符集,如下所示:
[DllImport("mydll.dll, CallingConvention = CallingConvention.Cdecl", CharSet = CharSet.Unicode)]
public static extern int myfunc(string var1, int var2, out int var3, out byte[] var4);
在这种情况下,它不会给出 FatalExecutionEngineError,而是函数返回没有错误。但是返回值表明函数发生了内部错误。(我不知道为什么字符集更改会阻止 FatalExecutionEngineError。)
我不确定我做错了什么,请帮助我。