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

时间:2016-04-21 13:40:08

标签: c# pinvoke dllimport

我使用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异常。谁能指出我正确的方向?我已经在这里待了几个小时了,谷歌还没能把我直接放

1 个答案:

答案 0 :(得分:3)

  • dwSize按地址传递,因此它应为ref参数。
  • 如果任何非零值可能为真值,则必须对
  • BOOL返回类型进行封送处理
  • 我不确定您是否真的想使用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);