0

私は問題を抱えており、ネット上で答えを見つけることができません。C# コードから C++ 関数を呼び出したい。C++ 関数は次のように宣言されます。

int read(InfoStruct *pInfo, int size, BOOL flag)

次の構造で

typedef struct
{
    int ID; 
    char Name[20];
    double value;
    void *Pointer;
    int time;
}InfoStruct;

私の c# コードでは、次のように書きました。

 public unsafe struct InfoStruct
 {
    public Int32 ID;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public string Name;
    public Double value;
    public void *Pointer;
    public Int32 time;
  };

[DllImport("mydll.dll", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        public static extern unsafe int read(out MeasurementInfoStruct[] pInfo, int size, bool flag);

コードを実行しようとしましたが、クラッシュするので、特に void* という構造を間違えたと思いますが、代わりに何を配置すればよいかわかりません。関数が構造体の配列を返すという事実もあり、おそらく私はそれを正しく呼び出していません。これで私を助けてもらえますか?どうもありがとう。

4

1 に答える 1

0

テスト アプリケーションを作成しました。コードは以下のとおりで、正常に動作しています...

// CPP code

typedef struct
{
    int ID; 
    char Name[20];
    double value;
    void *Pointer;
    int time;
}InfoStruct;

int WINAPI ModifyListOfControls(InfoStruct *pInfo, int size, bool flag)
{

    int temp = 10;
    pInfo->ID = 10;
    strcpy(pInfo->Name,"Hi");
    pInfo->value = 20.23;
    pInfo->Pointer = (void *)&temp;
    pInfo->time = 50;
    return 0;
}
/***************************************************/
// This is C# code
[StructLayout(LayoutKind.Sequential)]
public struct InfoStruct
{
    public Int32 ID;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
    public string Name;
    public Double value;
    public IntPtr Pointer;
    public Int32 time;
};


[DllImport(@"D:\Test\Projects\Release_Build\WeldDll.dll", CallingConvention = CallingConvention.Winapi)]
public static extern int ModifyListOfControls(ref InfoStruct pInfo, int size, bool flag);// ref InfoStruct pi);

public static void Main()
{
    InfoStruct temp = new InfoStruct();

    temp.Pointer = new IntPtr();

    ModifyListOfControls(ref temp, 200, true);

    Console.WriteLine(temp.ID);
    Console.WriteLine(temp.Name);
    Console.WriteLine(temp.time);
    Console.WriteLine(temp.value);


    Console.ReadLine();
}

/ * ** * **出力* ** * ** * * 10 Hi 50 20.23 * ** * ** * ** * ** * ** * ** * * /

于 2013-06-19T11:21:19.197 に答える