7

外部呼び出し用に C++ 関数で定義しました。

template<typename T>
void __declspec(dllexport) SwapMe(T *fisrt, T *second)
{
    std::cout << typeid(T).name() << std::endl;

    T temp = *first;
    *first = *second;
    *second = temp;
}

C# プログラムで使用したい。私はこの方法で試しました:

unsafe class Program
{
    [DllImport("lib1.dll", EntryPoint = "SwapMe")]
    static extern void SwapMe<T>(T first, T second);

    ...
}

しかし、私はそのようなエラーが発生しています:

ジェネリック メソッドまたはジェネリック クラスのメソッドは、内部呼び出し、PInvoke、または COM Import クラスで定義されています。

C# の Generic はマネージ型であり、C++ のアンマネージ テンプレートを使用すると、アーキテクチャによってかなり異なるものになるようです。

C# プログラムでテンプレート メソッドを使用するにはどうすればよいですか?

4

2 に答える 2

8

テンプレート関数は、C++ コンパイラによってバイナリに焼き付けられません。特殊なバージョンのみが発行されます。C++ コンパイラは、テンプレート定義を論理的に複製し、T必要な具象型に置き換えます。

これは、専用のラッパーを作成する必要があることを意味します。

void __declspec(dllexport) SwapMe(int *fisrt, int *second) { //example
{ SwapMe(first, second); }

これは C# から呼び出すことができますが、テンプレート バージョンを呼び出すことはできません。

C++ テンプレートと C# ジェネリックの動作は大きく異なります。

于 2012-12-29T21:13:30.183 に答える