c++ dll struct to c#

c++ dll struct to c#

本文关键字:to struct dll c++      更新时间:2023-10-16

可能的重复项:
将结构数组C++封送到 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;

结构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++ dll,那么你就可以将这些 dll 用于 C# 项目。 遵循以下方法

  1. 打开Visual Studio Command Prompt (Run as Administartor)
  2. 更改 dll 所在的路径 (cd C:/User/Douments/Visual Studio 2010/)
  3. 键入命令

tlbimp .dll/transform:dispret/out:

你会得到这样的结果。

Microsoft (R) .NET 框架类型库到程序集转换器 4.0.30319.1版权所有 (C) Microsoft 公司。 保留所有权利。

TlbImp:导入到 C:\Users\082043\Desktop\Interop.CACDirect 的类型库.dll

C:\用户\082043\桌面>