.NETランタイムでのリモートリフレクション

この記事の著者は、Serdar Kurbanovです。SerdarKurbanovは、チームの創設者であり、Telescopeの主要な開発者です。




ソフトウェアを使用する場合、問題が発生しても、アプリケーションを停止できない、または停止することが望ましくない状況があります。 デバッガーを使用できないような状況では、エラーを検出するのは簡単な作業ではありません。

アプリケーションがマルチスレッドを使用している場合、状況はさらに混乱する可能性があります。 ロギングは、どのスレッドがエラーの原因であるかを判断するのに役立ちますが、より普遍的な解決策は、実行中のプログラムを調べて、停止せずにその中のオブジェクトの状態を確認することです。 このタスクの1つのアプローチは、System.Reflectionの機能を使用することです。









リフレクション を使用したソリューション

前述の問題に対するリフレクションの使用を検討してください。マルチスレッドプログラムは正しく機能せず、このプログラムのスレッドの詳細が必要です。 この状況をシミュレートするために、System.Threading.ManualResetEventSlimを使用して2つのスレッドが同期されるコンソールアプリケーションを作成します。 スレッドの1つは2番目のスレッドの前に実行を完了しますが、どのスレッドが遅れているかを理解する必要があります。



次に、Reflectionを使用して同期オブジェクトのプロパティを表示するクラスをプログラムに追加します。







また、リクエストに応じてReflectionを使用して取得したデータをブラウザウィンドウに表示できるようにするコードを追加します127.0.0.1:20000







プログラムを起動し、ブラウザで指定されたアドレスを要求すると、オブジェクトのプロパティが表示され、最初のスレッドが作業を完了し、2番目のスレッドがまだ完了していないことがわかります。







アイデア開発





このアイデアを使用して、望遠鏡アプリケーションを作成しました 。これはflussig.orgからダウンロードできます。 これは、Visual Studioの監視ウィンドウなど、.NETアプリケーションでオブジェクト値をリモートで表示するためのプログラムですが、プログラムを停止せずにオブジェクトをリモートで表示できます。 ソリューションは、プロジェクトに埋め込まれ、Reflectionを使用してオブジェクトに関するデータを受信するTelescopeNode.dllアセンブリと、監視対象オブジェクトに関する情報のアグリゲーターの役割を果たし、オブジェクトのリストを表示するブラウザに情報を転送するTelescope.exeプログラムの2つの部分で構成されますプロパティ。



マルチスレッドアプリケーションの同期オブジェクトに関する同じタスクで、次のコードを使用してオブジェクトのプロパティにバインドできます。







その結果、ブラウザウィンドウでは、オブジェクトのプロパティが次の形式で表示されます。







少しの哲学

最新の開発では、最も柔軟なアプローチと開発者、テスター、マネージャー、顧客間の緊密な関係を使用しようとします-アジャイルとDevOpsは、商業企業向けの製品を作成するほとんどの開発チームで(明示的または暗黙的に)使用されます。エンドユーザーの満足度が向上します。 柔軟性は管理者の仕事とソフトウェアの両方によって決定されます。IDEの正しい選択、単体テストによるプログラムの作業シナリオの範囲、継続的な統合によって促進されます。

望遠鏡を作成することで、テストとデバッグのレベルに柔軟性を追加し、リリース後にデバッグの類似物を作成できるようにしたいと考えています。 望遠鏡は、エラーに対する最後の防衛線として使用できます(特に内部製品では、アクセスが容易です)-プログラムがリリースで既に実行されているが、一部のオブジェクトの状態を監視するか、既にコミットされているエラーの原因を特定する必要がある場合



All Articles