我有一个C ++ .dll,我必须在C#中使用它,但是有一些问题。首先,这是其中之一。
这里使用C ++ .dll文件我必须在C ++ struct下面改为C#struct。请帮帮我。
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;
答案 0 :(得分:1)
struct USMC_DEVICES_st将转换为类似于:
的内容using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential)]
struct USMC_DEVICES_st
{
public UInt32 NOD;
public IntPtr serial;
public IntPtr Version;
}
访问Serial和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));
}
}
答案 1 :(得分:0)
首先,如果您有C ++ DLL,那么您可以将这些dll用于C#Project。按照以下方法
tlbimp .dll / transform:dispret / out:
您将在下面得到如下结果。
Microsoft(R).NET Framework类型库到程序集转换器4.0.30319.1 版权所有(C)Microsoft Corporation。保留所有权利。
TlbImp:导入到C:\ Users \ 082043 \ Desktop \ Interop.CACDirect.dll的类型库
C:\用户\ 082043 \桌面和GT;