c++;dll结构到c#
可能重复:c++;dll结构到c#,c#,c++,dll,struct,C#,C++,Dll,Struct,可能重复: 我有一个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 str
我有一个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;
首先,如果你有C++ DLL,那么你可以将这些DLL应用到C语言项目中。遵循以下方法
C:\Users\082043\Desktop>struct USMC\u DEVICES\u 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));
}
}
静态无效打印设备(USMC\u设备)
{
常量int serialSize=16;
const int verSize=4;
int j=0;
对于(变量i=0;i
谢谢您的回答,请您解释清楚。因为我没有知道,有一种简单的方法来使用C++ DLL而不是通过导入C来修改代码,假设你有MySAMPL.DLL(C++ + DLL)。然后打开Visual Studio命令提示符(以管理员身份运行)更改dll所在的路径(cd C:/User/Douments/Visual Studio 2010/)键入命令tlbimp MySample.dll/transform:dispret/out:Interop.MySample.dll,然后您将在文件夹中获得.Net CLR dll。然后您可以将这个互操作dll添加到您的项目中。消耗所有C++函数。如果您还有问题,请告诉我。谢谢您的回答,还有一个问题要问您,我如何更改无效打印设备(USMC_设备和DVS){for(DWORD I=0;I