3

ネイティブ コードが .NET コードと対話する方法を理解しようとしており、基本的にこのトピックへの回答の例を実装しようとしています。サンプル コードには 2 つの部分があり、1 つは /clr オプションでコンパイルされた .dll に入ります。

__declspec(dllexport) bool toUpper(void)
{
    return true;
}

この関数を呼び出すコードは、ネイティブにコンパイルされた win32 アプリケーションに入ります。

bool toUpper(void);

int _tmain(int argc, _TCHAR* argv[])
{
    bool b = toUpper();
    return 0;
}

ただし、vs2010 では次のリンカ エラーが発生します。

エラー LNK2019: 未解決の外部シンボル "bool __cdecl toUpper(void)" (?toUpper@@YA_NXZ) が関数 _wmain で参照されています

dll プロジェクトの /clr オプションをオフにするとすぐに、すべてが機能するので、プロジェクト間のすべての依存関係が正しく設定されていると想定します。私が間違ったことについて何か提案はありますか?

4

1 に答える 1

3

/clr なしでこれを機能させるには、Project + Project Dependencies を使用している必要があります。はい、プロジェクトが /clr でコンパイルされている場合、これは機能しません。マネージ コードに .lib を使用するのは非常に珍しいことです。管理対象プロジェクトの .lib をリンクするようにリンカに明示的に指示する必要があります。

EXE プロジェクト、プロパティ、リンカー、入力、追加の依存関係の設定を右クリックします。両方のプロジェクトが 1 つのソリューションにあると仮定して、次のように入力します。

..\$(ConfigurationName)\mumble.lib

mumbleは管理対象プロジェクトの名前ですリリース構成について繰り返します。

この方法でマネージ コードを使用すると、スケーリングがうまくいかないことに注意してください。C++/CLI コンパイラは、マネージド関数を呼び出す前に CLR が読み込まれ、初期化されていることを確認する、エクスポートされた関数のサンクを自動的に生成します。ただし、それにはコストがかかります。CLR の初期化のオーバーヘッドを考慮せずに、ラップトップでの呼び出しごとに 640 ナノ秒でクロックしました。COM を使用することは、そのコストを回避する効果的な方法です。または、CLR を自分でホストして、CorBindToRuntimeEx() を検索することもできます。

于 2011-06-26T14:31:06.837 に答える