如何翻译"#34;以下C ++函数
LONG CALL_METHOD NET_SDK_Login(
char *sDVRIP,
WORD wDVRPort,
char *sUserName,
char *sPassword,
LPNET_SDK_DEVICEINFO lpDeviceInfo);
到.Net(C#)与P / Invoke一起使用?我试过
[DllImport("DVR_NET_SDK.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int NET_SDK_Login(
[MarshalAs(UnmanagedType.LPStr)] string sDVRIP,
ushort wDVRPort,
[MarshalAs(UnmanagedType.LPStr)] string sUserName,
[MarshalAs(UnmanagedType.LPStr)] string sPassword,
out _net_sdk_deviceinfo devinfo);
但没有运气。有人可以帮忙吗?
答案 0 :(得分:1)
问题中的翻译很好。问题在于你对结构的翻译。正如我在回答您之前的问题时所解释的那样,您没有正确翻译结构。您无法转换结构中的内联数组。
例如,在结构的C ++版本中,我们看到了这个字段:
unsigned char deviceMAC[6];
您将其翻译为
byte deviceMAC;
这是一个明显的错误。我确信你意识到不可能将6字节的MAC地址装入一个字节。
需要像这样翻译:
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] deviceMAC;
等等结构中的所有其他数组。
答案 1 :(得分:0)
您可以编写一些C ++ / CLI包装器,允许从C#(托管)调用非托管代码(C ++)
C#=> C ++ / CLI => C ++
您可以查看此问题及其回答:C++/CLI: why should I use it?