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
字符集。尝试 Auto
或 Unicode
.
LPStr
和StdCall
不是必须的,它们是默认设置。
所以试试这个:
[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);
我使用 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
字符集。尝试Auto
或Unicode
. LPStr
和StdCall
不是必须的,它们是默认设置。
所以试试这个:
[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);