問題タブ [appdomain]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - AppDomain 内のクラスのインスタンスをカウントする
プログラムまたはサードパーティのツール (プロファイラー?) を使用して、AppDomain で現在アクティブなクラスのインスタンス数 (派生クラスを含むまたは除外) の概要を取得する方法があるかどうか疑問に思います。割り当てられます(それが可能かどうかはわかりません)。
私は自分のクラスを変更して何らかの実行中のカウンターを含めることができることを知っていますが、私が制御していない (管理された) クラスにもこれが必要です。
それは可能ですか?いくつかのヒントやキーワードが役立ちます:)
asp.net - ASP.Net アプリケーション内のすべてのページは同じ appdomain で実行されていますか?
リクエストが異なるスレッドによって処理されることは理解していますが、それらはすべて同じ appdomain からのものですか?
.net - リフレクション操作のために .NET アセンブリをロードし、その後アンロードする方法は?
クライアントのシステム内の環境と地域にまたがってデプロイされた .NET アプリケーションに関する情報を報告するツールを作成しています。
これらのアセンブリのアセンブリ属性の値を読みたいと思います。
これは を使用して実現できますがAssembly.ReflectionOnlyLoad
、この方法でもアセンブリがロードされたままになります。ここでの問題は、異なるパスから同じ名前を持つ 2 つのアセンブリを読み込むことができないため、異なるシステムにデプロイされた同じアプリケーションを当然比較することができないことです。
この時点で、ソリューションには一時的なAppDomain
s の使用が含まれると想定しています。
アセンブリを別のAppDomain
にロードし、そこから属性を読み取ってからアンロードする方法を誰かが詳しく説明できますかAppDomain
?
これは、URL アドレスにあるアセンブリだけでなく、ファイル システム上のアセンブリにも機能する必要があります。
c# - C# コンソール アプリケーションでキャッチされない例外を処理する
現在、いくつかのモジュールをホストするサーバーを作成しています。サーバーは、各モジュールを個別の AppDomain で実行します。私が達成したいのは、例外の分離です。つまり、1 つのモジュールが例外をスローしたときに、プロセス全体を終了させたくありません。この特定の AppDomain だけです。異なるスレッドでキャッチされていないすべての例外が飲み込まれたときに、CLR に古い動作 (.NET 1.0) にフォールバックするように指示できることはわかっています。ただし、これは最も「エレガントな」ソリューションではありません。
iis - IIS のユーザー セッションごとのアプリ ドメイン
この質問は、アプリ ドメインとセッションに関するものです。IIS で各ユーザー セッションを個別のアプリケーション ドメインで実行することは可能ですか。はいの場合、これに影響する構成ファイルの設定を教えてください。
よろしく、アニル。
.net - ファイナライザースレッドの範囲は何ですか?アプリケーションドメインごとまたはプロセスごとですか?
私のすべての読みに基づいて、すべてのファイナライザーを呼び出すための1つのGCスレッドが必要です。ここで問題となるのは、この「1つの」スレッドの範囲です。プロセスごとまたはアプリケーションドメインごとです。ドメインの全体的な目的は、1つのプロセススペースで「独立した」異なるアプリケーションを分離して作成することです。
私はここを読んだ:
ファイナライザーで未処理の例外が発生した場合、CLRの実行スレッドは例外を飲み込み、ファイナライザーを正常に完了したかのように扱い、侵害可能なキューから削除して次のエントリに移動します。
ただし、もっと深刻なのは、ファイナライザーが何らかの理由で終了しない場合、たとえば、ファイナライザーがブロックされ、決して発生しない状態を待機している場合にどうなるかです。この場合、ファイナライザスレッドがハングするため、ファイナライズ可能なオブジェクトがガベージコレクションされることはありません。この状況を十分に認識し、ファイナライザーで管理されていないリソースを解放するための最も単純なコードの記述に固執する必要があります。
もう1つの考慮事項は、アプリケーションのシャットダウン中に何が起こるかです。プログラムがシャットダウンすると、ガベージコレクターは、ファイナライズ可能なすべてのオブジェクトのファイナライザーを呼び出そうとしますが、特定の制限があります。
ファイナライズ可能なオブジェクトは、シャットダウン中に上位のヒープ世代にプロモートされません。
個々のファイナライザーの実行時間は最大2秒です。それより長くかかる場合、それは殺されます。
すべてのファイナライザーが実行されるまでに最大40秒かかります。ファイナライザーがまだ実行中の場合、またはこの時点で保留中の場合、プロセス全体が突然強制終了されます。
「アプリケーション」、「プロセス」、「アプリケーションドメイン」という用語の誤用が多すぎる投稿(および公式ドキュメント)-通常、アプリケーションは単一のプロセスで単一のアプリケーションドメインで実行されるため、それらのほとんどは同等であると想定しています。 。この誤用により、これらのドキュメントはすべて読みにくくなり、役に立たなくなります。
したがって、私の質問では、複数のアプリケーションが、それぞれが単一のプロセスの個別のアプリケーションドメインで実行されることを前提としています。
これらのアプリケーションはすべて同じGCスレッドとファイナライザースレッドを共有していますか?上記の記事で説明されている問題(ファイナライザースレッドのハング)は、そのプロセスのすべてのアプリケーションに影響しますか?はいの場合-ファイナライザースレッドを検出してThread.Abortを送信するなどの回避策(悪いアプリケーションを使用しないこと以外)はありますか?
上記のすべては、私が同様の問題にぶつかったためです。私のアプリケーションは、サードパーティソフトウェア(Outlook)へのアドインとして別のアプリケーションドメインで実行されます。さまざまな理由により、COM参照を完全に解放するためにGC.CollectとGC.WaitForPendingFinalizersを呼び出す必要があります(通常の相互運用ルーチンはOffice / Outlookには不十分です)。特定の他のサードパーティのアドインが実行されていると、GC.WaitForPendingFinalizersが永久にハングします。 、そのため、そのサードパーティに「悪い」ファイナライザーが追加されているのではないかと思います。私はその追加(クライアントの要件)を置き換える/削除することを制御できないので、それらを共存させる方法を自分で理解する必要があります。
c# - COM 相互運用機能は、アセンブリの読み込みで .NET AppDomain 境界を尊重しますか?
核となる問題は次のとおりです。別の AppDomain でCOM 相互運用機能を使用する .NET アプリケーションがあります。COM スタッフは、COM スタッフが呼び出されている AppDomain ではなく、アセンブリをデフォルト ドメインにロードしているようです。
私が知りたいのは、これは予想される動作ですか、それとも、これらの COM 関連のアセンブリが間違った AppDomain に読み込まれるようにするために何か間違ったことをしているのですか? 以下の状況の詳細な説明を参照してください...
アプリケーションは 3 つのアセンブリで構成されています。 - アプリケーションのエントリ ポイントであるメイン EXE。- インターフェイス IController (IPlugin スタイル) のみを含む common.dll - IController および MarshalByRefObject を実装する Controller クラスを含む controller.dll。このクラスはすべての作業を行い、COM 相互運用機能を使用して別のアプリケーションと対話します。
メイン EXE の関連部分は次のようになります。
common.dll には、次の 2 つだけが含まれています。
そして、controller.dll には次のクラスが含まれています (COM 相互運用機能も呼び出します)。
アプリケーションを最初に実行すると、Assembly.GetAssemblies() は予想どおりに表示され、common.dll は両方の AppDomains に読み込まれ、controller.dll はコントローラー ドメインにのみ読み込まれます。ただし、c.Run() を呼び出した後、COM 相互運用機能に関連するアセンブリがデフォルトの AppDomain に読み込まれ、COM 相互運用が行われている AppDomain には読み込まれていないことがわかります。
なぜこれが起こっているのでしょうか?
興味がある場合は、ここに少し背景があります。
もともと、これは 1 AppDomain アプリケーションでした。それがインターフェースするCOMのものは、長期間使用すると安定しないサーバーAPIです。COM から COMException (その原因に関する有用な診断情報がない) が発生した場合、COM 接続が再び機能する前に、アプリケーション全体を再起動する必要があります。COM アプリケーション サーバーに再接続するだけで、再びすぐに COM 例外が発生します。これに対処するために、COM 相互運用機能を別の AppDomain に移動しようとしました。これにより、謎の COMExceptions が発生したときに、それが発生した AppDomain をアンロードし、新しいものを作成して、アプリケーションを手動で再起動することなく、最初からやり直すことができます。 . とにかくそれが理論でした...
.net - Activator.GetObject - MarshalByRefObject
.Net Activator.GetObject(Type type, string url, object data) では、プロキシをオブジェクトに返します。プロキシは MarshalByRefObject から継承され、AppDomains 間で送信できると思います。私は正しいですか?
私のアプリでは、appdomain A でオブジェクトを作成し、それを appdomain B で使用しています。オブジェクトのメンバーは、Activator.GetObject () を使用して作成された proxyobjects です。そのため、AppDomain B にいるときは、appdomain A で作成されたオブジェクトへの透過プロキシがあります。プロキシ オブジェクトでメソッドの呼び出しを実行しようとすると、エラーが発生します。
たとえば、App Domain B に Connection オブジェクトを作成します。App Domain A に Connection オブジェクトの透過プロキシがあります。AppDomain A からこのような呼び出しを行おうとすると、エラーが発生します。 ConnectionObject.SecurityProxy.GetSecurityAccount ( )。問題のように見えますが、上記のような呼び出しを行うと、呼び出しを AppDomain B に転送するのではなく、AppDomain A で SecurityProxy を再度作成しようとしています。オブジェクトが作成されました。
私が間違っていることを理解するのを手伝ってもらえますか?
よろしく、アニル。
c# - スレッドセーフな使用のために静的クラスのスコープを制限するために AppDomain を使用する方法は?
私は、設計が不十分なソリューションに悩まされてきました。スレッドセーフではありません!
ソリューションにはいくつかの共有クラスとメンバーがあり、開発中はすべてクールでした...
BizTalk は私の戦艦を沈めました。
カスタム BizTalk アダプターを使用してアセンブリを呼び出しています。アダプターは私のコードを呼び出して並行して実行しているため、同じ AppDomain の下ですべて複数のスレッドを使用していると思います。
私がやりたいことは、自分のコードを独自の AppDomain の下で実行することです。これにより、私が抱えている共有の問題が互いに干渉することはありません。
BizTalk アダプターがインスタンス化してから Process() メソッドを実行する非常に単純なクラスがあります。
Process() メソッド内に新しい AppDomain を作成したいので、BizTalk が別のスレッドをスピンするたびに、独自のバージョンの静的クラスとメソッドが作成されます。
BizTalkAdapter コード:
これはクラス BizTalk コールです。
参考までに: Loader クラスは、dataFile クラスとは別の DLL にあります。
どんな助けでも大歓迎です。コードをスレッドセーフにする作業を続けますが、これが「単純な」答えになると思います。
他に思い当たる人がいたら、どうぞ。
ありがとう、
キース
完全を期すためだけに。
「Transport Advanced Options」ダイアログで送信アダプタを「Ordered Delivery」としてマークすると、発生していたマルチスレッドの問題を回避できることがわかりました。
これは私の問題に対する別の可能な答えだと思いますが、必ずしも質問に対するものではありません。
c# - AppDomains 間の通信に最適な方法は?
多数の AppDomain 間で適度に大量のメッセージを送信する必要があるアプリケーションがあります。リモート処理を使用してこれを実装できることはわかっていますが、クロスドメイン デリゲートがあることにも気付きました。誰もこの種の問題を見たことがありますか?