問題タブ [marshalbyrefobject]
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# - MarshalByRefObject と AppDomain でメモリ リークを防ぐ方法は?
アプリでいくつかのスクリプト機能を使用できるように、実行時にいくつかのコードをコンパイルしようとしていますが、誰かがいたずらをしようとした場合に備えて、サンドボックスでスクリプトを実行したかったのです。
問題は、すべてが完了して出力が得られた後、メモリが解放されず、コードを実行するために生成された「c.dll」ファイルがプロセスでロックされたままになるため、削除しようとしても失敗することです。 - つまり、コードを 2 回実行しようとすると、「c.dll」が「別のプロセス」で既に開いているため、再度コンパイルできません。すべてのコードは次のとおりです。
すべてが始まる場所:
これがサンドボックスです。
これは CrossAppDomainObject です。
https://nbevans.wordpress.com/2011/04/17/memory-leaks-with-an-infinite-lifetime-instance-of-marshalbyrefobject/の Nathan Evans のブログから CrossAppDomainObject 抽象クラスを取得したことに注意してください。
私はここで完全に無知なので、私はどんなガイダンスにも大いに役立ちます。
編集:
ハンスが製図板に戻るように言った後、私はまさにそれを実行し、次の MSDN 記事を参照用に使用しました: https://msdn.microsoft.com/en-us/library/bb763046(v=vs.110).aspx
少し遊んだ後、これをハックしました:
c# - VS で appdomain の戻り値をデバッグする方法
私の c# プログラムは複数の appdomain を使用してアセンブリをロード/アンロードしています。2 番目の appdomain の私のアセンブリは、MarshalByRefObject を継承するオブジェクトを返しています。
私の問題は、Visual Studio がそれに関する情報を表示できないことを教えてくれることです。
透過プロキシのランタイム タイプの取得は、このコンテキストではサポートされていません。
2 番目の appdomain のクラスにいるときに、このオブジェクトに関する情報を確認できます。
私の質問: Visual Studio にこのオブジェクトに関する情報を 1. appdomain に表示するように指示することは何とか可能ですか?
編集:
解決策を見つけましたが、これは単なる回避策です。json との間でオブジェクトをシリアライズおよびデシリアライズして、クリーン コピーを取得します。
しかし、より良い解決策があれば教えてください:)
編集2:
詳細に説明するコード:
c# - C# の別のプロセスからクラスのインスタンスにアクセスする
インターフェイスを宣言する「Core」というプロジェクトがあります。そして、そのインターフェイスを実装するクラスをインスタンス化する「サービス」というプロジェクトがあります(依存関係で「コア」プロジェクトを参照します)。
「コア」(EXE)を実行できるため、両方のプロジェクトは独立して実行されます。実行している場合は、「サービス」が実行されているかどうかを確認し、実行されている場合は、「サービス」プロセスで作成されたクラスのインスタンスを取得して、そのメソッドを呼び出します。
こんな感じです(ほぼ)。
「コア」プロジェクトで:
「サービス」プロジェクトで:
あるプロセスから別のプロセスに何らかの形でマーシャリングする必要がありますが、それを呼び出す相互運用メソッドには慣れていません。