将 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;

对于结构中的所有其他数组依此类推。