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));
}
}