動的呼び出しでの RuntimeBinderInternalCompilerException 質問する

動的呼び出しでの RuntimeBinderInternalCompilerException 質問する

オブジェクトを動的引数として渡すと、予期しない RuntimeBinderInternalCompilerException が発生します。

あまりにも複雑なので、コードを簡単に貼り付けることはできないので、シナリオを説明してみます。Roslyn で非常に奇妙なハッキングを行っているので、奇妙に聞こえるかもしれません。

  1. アプリケーションを実行する
  2. ソースコードの変更を監視する
  3. 変更されたファイル/クラスを含むアセンブリの差分を実質的に再コンパイルします。
  4. 新しくコンパイルされたアセンブリを元のAppDomainにロードします。
  5. 既存のオブジェクト インスタンスを新しいコードまたは変更されたコードに動的に渡すことで、新しいコードが既存のコンテキスト/アプリケーション状態で動作できるようになります。

このダイナミックなパスすべき型に互換性があるため、機能します。つまり、私のケースでは、機能的に一致するメソッド/型があることを保証できます。

しかし、changed+reloaded メソッドを実行し、dynamic 型のオブジェクトを受け取ると、この例外が発生します。

RuntimeBinderInternalCompilerException was unhandled.
An unexpected exception occurred while binding a dynamic operation

MSDNによると:

この種の例外は、RuntimeBinderException が通常のコンパイラ エラーの意味でバインドの失敗を表すのに対し、RuntimeBinderInternalCompilerException はランタイム バインダー自体の誤動作を表すという点で、RuntimeBinderException とは異なります。

Google ではこれに関する結果がまったく見つかりません。さらにデバッグする方法もわかりません。何か提案はありますか?

(実行時にさまざまなアセンブリをテスト アプリケーションに読み込み、さまざまなアセンブリからインスタンス化された型を動的パラメーターを受け入れる単一のメソッドに渡すことができることを確認するために、サンドボックス テストをいくつか実行しました。したがって、そのシナリオでは機能します。)

ベストアンサー1

詳細がなければ質問に答えるのは難しいですが、あなたの話を読むと、いくつか注意すべき点があります。

  1. 内部的には、すべての型名は完全修飾されています。つまり、同じアセンブリ、同じ名前空間、同じ名前を持つ型でない限り、2 つの型を同じものとして扱おうとすると、コンパイラはコードを拒否します。わずかに異なる型を .Net で結合するのは難しいことです。

  2. dynamic直感的に思った通りに動作しないこともあります。コンパイラーをいじっている場合は、IL がどのように動作するかを学び、コードと基本クラス ライブラリ コードの両方を見て、それらがどのように相互作用するかを確認することが非常に重要です。

低レベルの .Net 作業に非常に便利なツールは ILSpy です。イルスパイ

おすすめ記事