c# 调用方法使用 P/Invoke 导致 AccessViolation 异常

c# Calling method using P/Invoke causing AccessViolation Exception

我使用 P/Invoke 连接设备。但我一直坚持调用以下方法:

BOOL __stdcall voGetFirmwareVersion(IN OUT LPTSTR lpVersion,  IN OUT DWORD *dwSize);

在我的包装器中,我调用了这样的方法:

[DllImport(DLL_LOCATION, CharSet = CharSet.Ansi)]
private static extern Boolean voGetFirmwareVersion(string s, uint d);

我试图将输入更改为 Out/Ref 并尝试添加 [In,Out] 属性,但我不断收到 AccessViolation 异常。谁能指出我正确的方向?我已经在这里待了几个小时了,google 没能把我说清楚

  • dwSize是通过地址传递的,所以应该是ref参数。
  • BOOL return 如果任何非零值可能成为真值,则必须对类型进行编组
  • 我不确定您是否真的想使用 Ansi 字符集。尝试 AutoUnicode.
  • LPStrStdCall不是必须的,它们是默认设置。

所以试试这个:

[DllImport(DLL_LOCATION, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool voGetFirmwareVersion([MarshalAs(UnmanagedType.LPTStr)] string s, ref uint d);