1

C++ から .NET アセンブリを呼び出しています。

これは、私が呼び出すすべてのテスト .NET 4.0 プロジェクトで完全に機能します。

ただし、20 個のサブアセンブリを含む大規模なプロジェクトを呼び出すと、次のエラーで失敗します。

Failed to execute assembly: 0x80004003. GetLastError=126. dwReturn=1.

エラーを生成する C++ コードは次のとおりです。

DWORD dwReturn;
hr = pCLR->ExecuteInDefaultAppDomain(szApplication, szEntryType, szEntryMethod, szParameter, &dwReturn);
if (FAILED(hr))
{
    // Fails if I try the production assembly, with 20 subassemblies.
    printf("    Failed to execute assembly: 0x%X. GetLastError=%d. dwReturn=%d.\n", hr, GetLastError(), dwReturn);
}
else
{
    // Works 100% if I plug in a small toy assembly in .NET 4.0.
    wprintf(L"    Assembly returned: %d\n", dwReturn);
}

環境

  • ビジュアル スタジオ 2010 SP1。
  • 上記のコードの C++。
  • ターゲット アセンブリ用の .NET 4.0。
4

1 に答える 1

3

マネージコードはNullReferenceExceptionで終了しました。そのException.HResult値は0x80004003、E_POINTERです。

明らかに、それがマネージコードが死ぬ非常に一般的な理由です。マネージコードからネイティブコードへの移行では、例外の多くのコンテキストが失われます。これは、マネージコードに負担をかけ、重要なエラーロギング、少なくとも全能のException.StackTraceを実行します。.NET4AppDomain.FirstChanceExceptionイベントが役立つ場合があります。

マネージコードのデバッグ、プロジェクト+プロパティ、デバッグ、デバッガタイプ=混合を有効にして、問題をデバッグします。また、デバッグ+例外、CLR例外の[スロー]チェックボックスをオンにして、例外がスローされたときにデバッガーがプログラムを停止するようにします。

于 2012-09-10T13:49:57.517 に答える