将 C++ 类型转换为 C#

Translating c++ types to C#

本文关键字:类型转换 C++      更新时间:2023-10-16

如何"翻译"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++版本中,我们看到以下字段:

unsigned char deviceMAC[6]; 

你把它翻译为

byte deviceMAC;

这是一个明显的错误。我相信您意识到不可能将 6 字节的 MAC 地址放入一个字节中。

这需要像这样翻译:

[MarshalAs(UnmanagedType.ByValArray, SizeConst=6)]
public byte[] deviceMAC;

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

您可以编写一些 C++/CLI 包装器,这些包装器将允许从 C# 调用非托管代码 (C++) (托管)

C# => C++/CLI => C++

你可以看看这个问题和它的问题:C++/CLI:我为什么要使用它?