将c ++类型转换为C#

时间:2015-01-20 07:46:29

标签: c# c++ pinvoke dllimport

如何翻译"#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);

但没有运气。有人可以帮忙吗?

2 个答案:

答案 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?