0

重複の可能性:
C ++構造体配列をC#にマーシャリングします

私はC++.dllを持っており、C#で使用する必要がありますが、いくつかの問題があります。まず第一に、これはそれらの1つです。

ここで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;
4

2 に答える 2

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

シリアルとバージョンへのアクセスは、次のようなコードで実行できます。

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));
            }
        }
于 2012-11-27T08:40:11.477 に答える
0

まず、C ++ dllがある場合は、それらのdllをC#プロジェクトで使用できます。以下の方法に従ってください

  1. Visual Studioコマンドプロンプトを開きます(管理者として実行)
  2. dllが配置されているパスを変更します(cd C:/ User / Douments / Visual Studio 2010 /)
  3. コマンドを入力します

tlbimp .dll / transform:dispret / out:

以下のような結果が得られます。

Microsoft(R).NET Framework Type Library to Assembly Converter 4.0.30319.1 Copyright(C)MicrosoftCorporation。全著作権所有。

TlbImp:C:\ Users \ 082043 \ Desktop\Interop.CACDirect.dllにインポートされたタイプライブラリ

C:\ Users \ 082043 \ Desktop>

于 2012-11-27T08:37:18.800 に答える