2012-02-03 5 views
0

C#で実装したインターフェイスを呼び出すC++プログラムがあります。私は一貫して0x80131023 HOST_E_CLRNOTAVAILABLEというエラーを受け取りました。これはCLR has been disabled due to unrecoverable errorと定義されています。私のプログラムが呼び出されない限り、C++プログラムはこのエラーを生成しませんが、私はスタックトレース内のどの関数も見ることができません。問題を特定する上でどのようなヒントがありますか?C#プログラムは、C#インターフェイスを呼び出すときにHOST_E_CLRNOTAVAILABLEを受け取ります。

EDIT: 私はレイトバインディングを使用してIDispatchインターフェイスを作成しています。

IUnknown* pUnknown; 
hRC = CoCreateInstance(
     MyProgID,     
     0,       
     CLSCTX_ALL,     
     IID_IUnknown,    
     (void**) &pUnknown);   
hRC = pUnknown->QueryInterface(
     IID_IDispatch,    
     (void**) &_pService);  
pUnknown->Release(); 

は、その後で呼び出す:

hRC = _pService->Invoke(
     _DispIDs[nDispIDIndex], IID_NULL, LOCALE_USER_DEFAULT, 
     METHOD_TO_CALL, &Disp, &VarResult, NULL, NULL); 

それはエラーなしで正常な方法のほとんどを呼び出します。 Closeメソッドが呼び出されると、前述のエラーが返されます。

+2

ネイティブのC++プログラムでは、CLRを最初にロードして初期化することなくマネージコードを呼び出すことはできません。最初にCLRがロードされたことをどのようにして確認したかについては何も述べていません。最初にそれを記録せずに答えを得ることはできません。 –

+0

@HansPassantお詫び申し上げます、私は何が役に立つとは思っていませんでした。私はアドバイスとして質問を更新しました。 –

答えて

1

最も可能性の高い障害モードは、コールの1つが管理された例外をトリップして、キャッチされず、CLRがシャットダウンされることです。これは、マネージコードによって開始されたスレッドで発生した可能性があります。そのため、HRESULTを使用して報告されることはありません。それはトレースを残して、出力ウィンドウは、例外タイプ0xe0534f4dのための "最初のチャンスの例外"、通知を含めるべきです。

管理デバッガを使用してトラブルシューティングを行います。 VSにはProject + Properties、Debugging、Debuggerタイプの設定があります。 Debug + Exceptionsで自動ブレークを強制し、CLR例外のThrowボックスにチェックを入れます。

関連する問題