c# - c++ dll结构到c#

标签 c# c++ dll struct

<分区>

Possible Duplicate:
Marshal C++ struct array into C#

我有一个 C++ .dll,我必须将它与 C# 一起使用,但存在一些问题。首先,这是其中之一。

为了使用 C++ .dll 文件,我必须将下面的 C++ 结构重新更改为 C# 结构。请帮助我。

C++ 结构:

typedef struct USMC_Devices_st{
      DWORD NOD;             // Number of the devices ready to work

      char **Serial;        // Array of 16 byte ASCII strings
      char **Version;       // Array of 4 byte ASCII strings
} USMC_Devices;

最佳答案

struct USMC_DEVICES_st 将转换为类似于:

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
    struct USMC_DEVICES_st
    {
        public UInt32 NOD;

        public IntPtr serial;

        public IntPtr Version;
    }

可以使用如下代码访问序列号和版本号:

IntPtr ser;

for (var i = 0;
     (ser = Marshal.ReadIntPtr(um.serial, i)) != IntPtr.Zero;
     i += Marshal.SizeOf(ser))
{
    var serial = Marshal.PtrToStringAnsi(ser);
}

编辑 - 在您的评论之后是访问结构成员的更详细示例:

static void PrintDevices(USMC_DEVICES_st um)
        {
            const int serialSize = 16;
            const int verSize = 4;
            int j = 0;
            for (var i= 0; i < um.NOD; i++, j+= IntPtr.Size)
            {
                var ser = Marshal.ReadIntPtr(um.serial, j);
                var ver = Marshal.ReadIntPtr(um.Version, j);
                // ensure we check for null pointers - just in case
                if (ver == IntPtr.Zero || ser == IntPtr.Zero) break;

                Console.WriteLine("Device {0}, \tSerial number {1}",
                                    Marshal.PtrToStringAnsi(ser, serialSize),
                                    Marshal.PtrToStringAnsi(ver, verSize));
            }
        }

关于c# - c++ dll结构到c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13579932/

相关文章:

c++ - 具有动态功能集的 Qt 应用程序

c++ - 为什么 std::thread 在其构造函数中等待?

windows - 如何使用 SetWindowsHookEx 和 WH_KEYBOARD Hook 外部进程

c# - .Net 程序集中的循环引用

C# 枚举器术语困惑

c# - .NET Core 使用配置绑定(bind)到带有数组的选项

c++ - 每次运行程序时都使用相同的随机数

c++ - 如何确定哪个 Windows DLL 正在用于函数调用?

c# - MailMessage Bcc AddRange 的扩展方法

c# - Entity Framework 4 - ObjectContext.Refresh() 应该如何工作?