2


[DllImport("C:\\gaul-windows.dll", ...)]属性を介して C++ ライブラリを C# ソリューションに使用しています。

パラメータの一部がデリゲートである関数を使用する必要があり、それが返す型にもフィールドとしていくつかのデリゲートがあります。

これはできますか?

structを戻り値の型として使用しようとしたため、私は尋ねましたが、 「メソッドの型シグネチャは PInvoke と互換性がありません」という例外が発生しました。

だから私はそれを変更し、戻り値の型として IntPtr を使用しようとしましたが、次の例外が発生しました: 'パラメーター #16' をマーシャリングできません: ジェネリック型をマーシャリングできません。

まず、それが可能かどうかを知りたいですか?この種の機能をそのように使用すること。それが不可能な場合、どのように使用できますか?

編集

使用する必要がある機能

     [DllImport("C:\\gaul-windows.dll",
                 SetLastError = 真、
                 CallingConvention = CallingConvention.Cdecl)]
     public extern static IntPtr ga_genesis_boolean(intpopulation_size,
                                                         int num_chromo,
                                                         int len_chromo、
                                                         GAgeneration_hook ジェネレーション_フック、
                                                         GAiteration_hook iteration_hook,
                                                         GAdata_destructor data_destructor,
                                                         GAdata_ref_incrementor data_ref_incrementor,
                                                         GAevaluate 評価し、
                                                         Gシードシード、
                                                         GAadapt 適応、
                                                         GAselect_one select_one,
                                                         GAselect_two select_two,
                                                         GA変異変異、
                                                         GAクロスオーバー クロスオーバー、
                                                         G交換交換、
                                                         整数?ユーザーデータ);

これはデリゲートの 1 つの例です。

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate short GAselect_one(
        参照人口ポップ、
        IntPtr 母);

こちらクラス全体を取得できます。

そして最後に、これは関数への私の呼び出しです

    var x = Gaul.ga_genesis_boolean(30, /* const int 人口サイズ */
                                                  vehicle_num, /* const int num_chromo */
                                                  order_num, /* const int len_chromo */
                                                  IntPtr.Zero,// null, /* GAgeneration_hook generation_hook */
                                                  null, /* GAiteration_hook iteration_hook */
                                                  null, /* GAdata_destructor data_destructor */
                                                  null, /* GAdata_ref_incrementor data_ref_incrementor */
                                                  new GAevaluate(drp_score),/* GAevaluate 評価 */
                                                  new GAseed(Gaul.ga_seed_boolean_random), /* GAseed シード */
                                                  null, /* GAadapt 適応 */
                                                  new GAselect_one(Gaul.ga_select_one_bestof2),/* GAselect_one select_one */
                                                  new GAselect_two(Gaul.ga_select_two_bestof2),/* GAselect_two select_two */
                                                  new GAmutate(Gaul.ga_mutate_boolean_singlepoint), /* GAmutate mutate */
                                                  new GAcrossover(Gaul.ga_crossover_boolean_singlepoints), /* GAcrossover クロスオーバー */
                                                  null, /* GReplace 置換 */
                                                  null /* vpointer ユーザーデータ */
                                                  );

4

2 に答える 2

1

はい、パラメータの一部がデリゲートの場合、C++ ライブラリ関数を使用できます。

「'パラメーター #16' をマーシャリングできません: ジェネリック型をマーシャリングできません」というエラーが表示されました。デリゲートパラメーターではなく、null 許容整数についてでした。

于 2012-09-16T05:14:14.913 に答える
0

DllImportAttributeメソッド定義にのみ適用できます。そのメソッド定義は、DLL 内で宣言されているネイティブ関数のシグネチャを定義します。これは、メソッドがグローバル関数 (およびエクスポート) である必要があり、クラス関数をサポートしていないことを意味します。

DllImportAttributestruct や class などの型定義では使用できません。

グローバル関数ではない DLL からメソッドをインポートする場合は、グローバル関数を作成して、インポートするものをラップする必要があります。

于 2012-09-12T03:57:03.757 に答える