0

これが尋ねられた場合は、私の謝罪を受け入れてください. この件についてはあまり見つけられないようです。Primitive types pass template parameter between c++ and CLIも同様の質問ですが、あまり有益ではありませんでした。

テンプレート クラス (もちろん、そのインスタンス化) を公開するネイティブ C++ DLL があり、C# での類似物が必要でした。私は比較的 C# に慣れていませんが、最も近いのはジェネリックであることを知っています。

私の問題は、C++ テンプレートを C++/CLI テンプレート/ジェネリックでラップして、C# で使用できるようにする方法です。

  1. それは可能ですか?TCLIラッパーは、管理されていない未知の型をC#で使用するために管理された型にマーシャリングする方法を知らないため、これは不可能だと思います。

  2. 可能であれば、どのように対処しますか?そうでない場合、同様の状況で使用できる一般的な戦略は何ですか?

ありがとう。

4

3 に答える 3

1

テンプレート クラスは既に DLL からエクスポートされていると述べましたが、これはインスタンス化されたテンプレート クラスであることを意味します。

インスタンス化された C++ クラスは、P/Invoke の観点からは通常の C++ クラスと何の違いもありません。インスタンス化されたテンプレート クラスを呼び出すことは可能であり、C++/CLI を使用せずに C# から直接実行できますが、ラッパー コードを手動で記述するのは非常に時間がかかります。

これを手動で行う方法については、stackoverflow のC# pinvoke マーシャリング構造体を含む vector<structure>で共有しましたが、この方法でラッパー クラスを手動で記述するには時間がかかりすぎるため、努力する価値がない場合があります。

私が作成したツールxInterop NGen++は、テンプレート クラスの C# ラッパー クラスを生成できます。従来の C++ アプリケーションから同じ DLL を使用できる限り、ネイティブ C++ DLL からエクスポートされた任意の C++ クラスのラッパー クラスを生成できます。

詳細については、私のブログ Web サイトの以下のリンクを参照してください。

ネイティブ C++ テンプレート クラスを C# で自動的にラップする高度なテクノロジ

.NET からのインスタンス化された std::vector テンプレート クラスの作成とアクセス

予算が気になる場合は、近い将来、高速バージョンを無料でリリースする計画があります。そのため、いくつかの C++ テンプレート クラスを呼び出す必要がある小さなプロジェクトがある場合は、機能が制限された無料バージョンを使用して C# ラッパー クラスを作成できる場合があります。また、いくつかのオープン ソース C++ プロジェクト用に、生成された C# ラッパー (C# バインディング) をリリースする計画もあります。

(私はxInterop NGen++の作者です)

于 2013-08-02T04:11:26.950 に答える
1

管理されていないことについて話していると仮定するとC++、それは実際には不可能です。

一般に、複雑なものをアンマネージ C++ から C# に渡すのは非常に面倒です。

最も簡単な方法は、マネージド コードとアンマネージド コードの間でデータを受け渡すために使用できる単純な構造体を C++ で記述することです。(つまり、データ転送オブジェクトです。)

次に、メソッドをラップするアンマネージ関数 (C名前マングル シグネチャではなくシグネチャを使用) を記述し、代わりに C# からそのラッパー関数を呼び出します。C++C++

私はこれを数回実行しましたが、C# からアンマネージ C++ 関数を呼び出そうとするよりもはるかに扱いやすいです!

于 2013-06-28T11:21:21.287 に答える
0

サポートされているテンプレート引数の型と、C++/CLI ラッパーでこれらの型のマネージド <-> アンマネージド変換関数の明示的なリストを提供する意思がある場合は、実行可能です。こちらのコードを参照してください。

于 2013-08-02T12:06:55.117 に答える