将 C++ 类型转换为 C#
Translating c++ types to C#
如何"translate"遵循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);
但运气不好。有人可以帮忙吗?
您可以编写一些 C++/CLI 包装器,允许从 C#(托管)调用非托管代码 (C++)
C# => C++/CLI => C++
你可以看看这个问题及其答案:C++/CLI: why should I use it?
问题中提供的翻译很好。问题在于您对结构的翻译。正如我在回答您之前的问题时所解释的那样,您没有正确翻译结构。您无法转换结构中的内联数组。
例如,在结构的C++版本中我们看到这个字段:
unsigned char deviceMAC[6];
您将其翻译为
byte deviceMAC;
这是一个明显的错误。我相信您已经意识到将 6 字节 MAC 地址放入一个字节是不可能的。
需要这样翻译:
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] deviceMAC;
对于结构中的所有其他数组依此类推。
如何"translate"遵循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);
但运气不好。有人可以帮忙吗?
您可以编写一些 C++/CLI 包装器,允许从 C#(托管)调用非托管代码 (C++)
C# => C++/CLI => C++
你可以看看这个问题及其答案:C++/CLI: why should I use it?
问题中提供的翻译很好。问题在于您对结构的翻译。正如我在回答您之前的问题时所解释的那样,您没有正确翻译结构。您无法转换结构中的内联数组。
例如,在结构的C++版本中我们看到这个字段:
unsigned char deviceMAC[6];
您将其翻译为
byte deviceMAC;
这是一个明显的错误。我相信您已经意识到将 6 字节 MAC 地址放入一个字节是不可能的。
需要这样翻译:
[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] deviceMAC;
对于结构中的所有其他数组依此类推。