問題タブ [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.
c# - 別の AppDomain で IronPython エンジンをホストする方法は?
私は明白なことを試しました:
しかし、次のエラー メッセージが表示されます: Type is not resolve for member 'Microsoft.Scripting.Hosting.ScriptRuntimeSetup,Microsoft.Scripting, Version=0.9.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.
このエラーをグーグルで検索しても、実りある結果は得られませんでした...
編集#1:
関連するものを新しいコンソールアプリケーションにコピーして、最小限の再現プロジェクトを作成しようとしました:
これは期待どおりに機能します。
したがって、私が得ているエラーは、コメントアウトした行の 1 つに関連していると結論付けざるを得ません。エンジンに追加されたスコープには、私がほとんど制御できないオブジェクトが含まれています。 (Autodesk Revit Architecture 2010)で。
たぶん、それを渡そうとするとエラーが発生しますか?
代わりにプロキシを渡す方法はありますか? (.NET リモーティングを検索する必要があります...)
編集#2:
別の AppDomain にプロキシできないスコープを介してオブジェクトを渡すことに問題を絞り込みました: 別の AppDomain で実行されている IronPython インタープリターのスコープに追加されたすべてのオブジェクトは、何らかの方法でマーシャリングする必要があり、したがって、拡張MarshalByRefObject
または拡張する必要があります。するSerializable
。
c# - アプリケーションの終了を検出する方法は?
これは私の最初の質問へのフォローアップであり、私の調査結果を提示し、修正、アイデア、および洞察を求めたいと思います。私の調査結果 (またはむしろ解釈) は、MSDN .NET 3.5 のドキュメントを読み、.NET 3.5 コードをデバッグして、以前の質問に対する人々の回答から得られました。これが、私のようにアプリケーションの終了を検出する方法を知りたがっている誰かにとって価値のあるものになることを願っています。
イベント:
System.AppDomain.CurrentDomain.ProcessExit
: プロセスが終了したときに発生します。たとえば、デフォルトAppDomain
と他のすべてがアンロードされた後です [合計実行時間はわずか 3 秒に制限されています!]。WPF の場合は、System.Windows.Application.Exit
代わりに使用してください。Windows フォームの場合Application.Run(...)
、メイン メソッドの後にコードを実行します。System.AppDomain.CurrentDomain.DomainUnload
:ユニット テスト フレームワーク (TestDriven.NET を使用した MbUnit) でクラスを実行する場合AppDomain
など、既定以外のアンロード時に発生します。AppDomain
System.AppDomain.CurrentDomain.UnhandledException
: (デフォルトで処理される場合AppDomain
:) スレッドが開始されたスレッドに関係なく、任意のスレッドで未処理の例外に対して発生しますAppDomain
。つまり、これはすべての未処理の例外のキャッチオールとして使用できます。System.Windows.Application.Exit
: WPF アプリケーション (つまり、デフォルトAppDomain
) が正常に終了したときに発生します。System.Windows.Application.OnExit
それを利用するにはオーバーライドします。ファイナライザー (C# のデストラクタ): ガベージ コレクターがアンマネージ リソースを解放するときに実行されます。【総実行時間制限あり!
イベントの順序:
WPF アプリケーション: 正常な終了
System.Windows.Application.Exit
System.AppDomain.CurrentDomain.ProcessExit
- ファイナライザー
WPF アプリケーション: 未処理の例外
System.AppDomain.CurrentDomain.UnhandledException
TestDriven.NET 内で実行されている MbUnit: テストに合格 (正常終了)
System.AppDomain.CurrentDomain.DomainUnload
- ファイナライザー
TestDriven.NET 内で実行されている MbUnit: テストに失敗しました (未処理の例外は MbUnit によって処理されます)
AppDomain.CurrentDomain.DomainUnload
- ファイナライザー
質問:
- 私の解釈/調査結果は正しいですか?
- 私が省略した詳細を知っていますか?たとえば、ファイナライザーの合計実行時間は?
- 私が知っている他のイベント/アイデアを知っていますか?
- Windows フォーム、Web サービス、ASP.NET Web サイトなどの他のアプリケーションでは、どのようなイベントが発生し、どのような順序で発生しますか?
.net - 既定の AppDomain で特定のアセンブリのシャドウ コピーを使用することはできますか?
なぜ私がこれをしたいのかについての簡単な説明:
Autodesk Revit Architecture 2010 のプラグインを作成するのに忙しいです。デバッグ セッションごとに Autodesk を再起動し、Revit プロジェクトを手動でロードし、[アドイン]タブをクリックしてプラグインを起動する必要があるため、プラグイン コードのテストは非常に面倒です。これには時間がかかりすぎます。
IronPython インタープリターをホストする 2 つ目のプラグインを作成しました。このようにして、Revit が提供する API をいじることができます。しかし最終的には、コードを C# で書き直してデバッグする必要があります。
簡単だと思いました。IronPython スクリプトからプラグイン DLL をロードして実行するだけです。これは機能しますが、DLL が Revit AppDomain に読み込まれるようになったため、読み込まれると Visual Studio で再コンパイルできません。
簡単だと思いました (StackOverflow の助けを借りて): DLL を新しい AppDomain にロードするだけです。残念ながら、RevitAPI オブジェクトは拡張されないため、別の AppDomain にマーシャリングすることはできませんMarshalByRefObject
。
私はシャドウコピーで何かに乗っているかもしれないと思います。ASP.NET がこれを行っているようです。しかし、MSDN のドキュメントを読むと、AppDomainを作成するときにしか指定できないようです。
現在の (既定の) AppDomain に対してこれを変更できますか? 特定のディレクトリから DLL のシャドウ コピーを使用するように強制できますか?
.net - AppDomain.TypeResolveイベントをトリガーするC#コードを記述できますか?
AppDomain.TypeResolveは私の目には不思議です。誰かがこのイベントをトリガーするサンプルコードを提供できますか?
ありがとう。
asp.net - 自動テストの目的で、bin ディレクトリを使用せずに ASPNET ランタイムをロードおよびアンロードする方法
ASPNET ランタイムをロードし、1 つまたは複数のページを実行してから、アンロードしたいと考えています。これはテスト用です。UI テストではありません。ASPNET コンテキストでのライブラリの使用を実際にテストしているだけです。
通常、この種のことは への呼び出しで行われSystem.Web.Hosting.ApplicationHost.CreateApplicationHost
ます。
これは私が現在持っている方法です:
これはカスタム ASP.NET ホストです。
これは正常に動作します。しかし、可能であれば、bin ディレクトリの作成とアセンブリのコピーを避けたいと思います。
CreateApplicationHost
を使用して、現在のディレクトリまたは任意のディレクトリからアセンブリをロードするように ASPNET に指示することは可能bin
ですか?
編集::コードを少し簡略化しました。 EDIT2 :: womp 's answer を見ましたが、少し回避するために多くの作業を行っているようです。他のアイデアはありますか?
c# - 一部の.NetアセンブリがAppDomainのGetAssemblies()メソッドを介して利用できないのはなぜですか?
ASP.NETアプリケーションで実行されるAppDomainに現在ロードされているタイプをループするコードが少しあります。アセンブリを取得する方法は次のとおりです。
アプリケーションが最初に起動したときは問題はなく、私が期待するすべてのタイプが存在します。しかし、Web.configを更新するか、w3p.exeプロセスを強制終了すると(または何らかの理由でプロセスがリサイクルされると)、期待しているタイプの一部しか使用できません。デバッガーを使用してステップスルーすると、プライベート検索パス(アプリケーションのbinディレクトリ)からの特定のアセンブリがロードされていないことに気付きます。私は、すべてのアセンブリがアプリケーションの起動時にロードされ、すぐに必要かどうかに関係なく再起動することを前提としていました。ただし、再起動した場合、これらのアセンブリファイルが更新されていない限り、これは発生していないようです。
私が必要としているのは、後で使用するために起動時にタイプ情報を収集することです。ただし、再起動中は型が使用できないため、後で型情報を使用する必要があるときに大混乱を引き起こします。それを念頭に置いて、この欠陥をどのように解決または回避できますか?
asp.net - ASP.NET アプリケーションでの初回起動のタイミング
私の ASP.NET アプリは、iisreset またはアプリ ドメインのリサイクル後に最初のページ要求を読み込むのに時間がかかります。
アプリ ドメインのリサイクルにかかる時間を確実に測定する方法はありますか?
c# - AppDomain.CreateInstanceFromAndUnwrap - 透過プロキシをキャストできません
マネージ DLL を外部プロセスに挿入する .NET ライブラリを作成しています。私の現在のアプローチは次のとおりです。
CreateRemoteThread
ターゲット プロセスがLoadLibrary
アンマネージ ブートストラップ DLLを強制的に呼び出すために使用します。この時点から、ターゲット プロセスでコードを実行します。- 次に、ブートストラップ DLL は CLR のインスタンスを作成し、それを呼び出し
ExecuteInDefaultAppDomain
ます。これにより、マネージ ヘルパー DLL のメソッドが実行されます。 - このメソッドは、新しい AppDomain を作成
AppDomain.CreateInstanceFromAndUnwrap
し、ペイロード DLL に実行を渡すために呼び出し、結果をIInjectionPayload
. - ペイロード DLL は を実装するクラスを公開する
IInjectionPayload
ので、ヘルパー DLL は単純に を呼び出すことができますpayload.Run()
。
このようにして、ペイロードコードを呼び出すだけで完全にアンロードできるようにしていますAppDomain.Unload
(クリーンアップするように信号を送った後)。
このアプローチは機能します - ペイロード DLL のクラスはターゲット プロセスでインスタンス化されるため、コードを実行できCreateInstanceFromAndUnwrap
ます - しかし、返されたオブジェクトをIInjectionPayload
;にキャストすることはできません。次の例外がスローされます。
透過プロキシをタイプ「blah.Blah.IInjectionPayload」にキャストできません。
CreateInstanceAndUnwrap
を使用してみましActivator.CreateInstanceFrom
たObject.Unwrap
が、これらの方法の両方で同じ例外がスローされます。
私のペイロード クラスの署名は次のとおりです。
public class Program : MarshalByRefObject, IInjectionPayload
意図したとおり、ペイロード DLL が確実にロードされ、クラスがインスタンス化されているため、困惑しています。どんな助けでも大歓迎です。
java - このシナリオでは、appdomainsが役立つ可能性がありますか?
管理されていないdllへの呼び出しを介してJavaプロセスと通信しているdotnetプロセスがあります。
状況によっては、Javaプロセスがクラッシュし、dotnetプロセスがダウンしているように見えます。例外は発生せず、プロセスはただ終了します。クラッシュすると、javaは「hs_err_pid3228」などの名前のログファイルを作成します。
アンマネージDLLとJavaプロセスを提供しているベンダーから満足を得られなかったので、Javaプロセスへの呼び出しがクラッシュした場合でも、プロセスを停止しないようにする必要がある問題を軽減しようとしています。 。
さまざまな記事を読んだことで、appdomainsを使用する可能性が高いようです-私の理論では、Javaプロセスを呼び出す機能を少しの作業で分離し、別のappdomainで実行できます。これにより、appdomainをキャッチできない場合でも可能になると思います。ダウンしている場合は、少なくともそれが発生したことを検出し、その機能を再起動します。
誰かが同じような問題を抱えていましたか?このアプローチは、appdomainの経験が豊富な方にとっては合理的だと思いますか?
さらに楽しくするために、Javaのクラッシュは実際には再現可能ではありません-それは非常にランダムに見え、appdomainへの分離をテストする方法とまだ戦っています