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语言项目中。遵循以下方法

  • 打开Visual Studio命令提示符(以管理员身份运行)
  • 更改dll所在的路径(cd C:/User/Douments/Visual Studio 2010/)
  • 键入命令
  • tlbimp.dll/transform:dispret/out:

    您将得到如下结果

    Microsoft(R).NET Framework类型库到程序集转换器4.0.30319.1 版权所有(C)微软公司。版权所有

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


    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