24

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

コードを簡単に貼り付けるには複雑すぎるため、シナリオを説明しようと思います。私は Roslyn で非常に奇妙なハッカーを行っているので、奇妙に聞こえるかもしれません。

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

型には互換性があるため、この動的な受け渡しは機能するはずです。つまり、私の場合、機能的に一致するメソッド/型があることを保証できます。

しかし、changed+reloaded メソッドを実行しようとして、動的タイプのオブジェクトを受け取ると、この例外が発生します。

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

MSDN によると:

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

Google には、これに関する結果はまったくありません。さらにデバッグする方法もわかりません。助言がありますか?

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

4

1 に答える 1

2

これ以上の詳細なしに質問に答えるのは難しいですが、あなたが言ったことを読んで、注意すべき点がいくつかあります:

  1. 内部的には、すべての型名は完全修飾されています。これは、同じ名前空間と名前を持つ同じアセンブリからのものでない限り、2 つの型を同じものとして処理しようとすると、コンパイラがコードを拒否することを意味します。わずかに異なる型を .Net でメッシュ化するのは注意が必要です。

  2. dynamic直感的に思うように常に機能するとは限りません。コンパイラで遊んでいる場合は、IL がどのように機能するかを学び、自分のコードと基本クラス ライブラリ コードの両方を調べて、それらがどのように相互作用するかを確認することは非常に価値があります。

低レベルの .Net 作業に非常に役立つツールは ILSpy です: http://ilspy.net/

于 2014-02-17T20:24:39.420 に答える