0

CLI ダイアレクト経由でネイティブ C++ コードを呼び出すには、C# インターフェイスが必要です。C# インターフェイスは、必要なパラメーターの前にout属性指定子を使用します。これは、C++/CLIの%追跡参照に変換されます。

メソッドの署名と本体は次のとおりです (ジョブを実行するために別のネイティブ メソッドを呼び出しています)。

virtual void __clrcall GetMetrics(unsigned int %width, unsigned int %height, unsigned int %colourDepth, int %left, int %top) sealed
{
    mRenderWindow->getMetrics(width, height, colourDepth, left, top);
}

いくつかのコンパイル時エラー (すべて に関連するnot being able to convert parameter 1 from 'unsigned int' to 'unsigned int &') のため、コードはコンパイルされません。

控えめな C++ プログラマーの私にとって、CLI はドイツ語話者にとってオランダ語のように見えます。このラッパーを CLI で適切に動作させるにはどうすればよいですか?

4

3 に答える 3

2

削除された回答でも提案されたように、私は明白なローカル変数を使用して、関連する値を渡しました。

 virtual void __clrcall GetMetrics(unsigned int %width, unsigned int %height, unsigned int %colourDepth, int %left, int %top) sealed
        {
            unsigned int w = width, h = height, c = colourDepth;
            int l = left, t = top;
            mRenderWindow->getMetrics(w, h, c, l, t);
            width = w; height = h; colourDepth = c; left = l; top = t;
        }

追跡された参照のかなり直感的なメカニズムから、それは少し明白でした。それらはガベージコレクターの作業の影響を受け&、メモリ内の別の場所に配置される傾向がある場合、通常の参照ほど静的/一定ではありません。したがって、これが問題を克服するのに十分信頼できる唯一の方法です。最初の答えに感謝します。

于 2012-08-13T13:16:26.260 に答える
0

パラメータが C# 側で「out」を使用する場合、次のように C++/CLI パラメータを定義する必要があります。[Out] unsigned int ^%width

次に例を示します。

virtual void __clrcall GetMetrics([Out] unsigned int ^%width)
{
    width = gcnew UInt32(42);
}

次に、C# 側では、42 が返されます。

ValueType vt;
var res = cppClass.GetMetrics(out vt);
//vt == 42

C++/CLI 側で [Out] パラメーターを使用するには、以下を含める必要があります。

using namespace System::Runtime::InteropServices;

お役に立てれば!

于 2012-08-10T15:43:20.377 に答える