問題タブ [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# - セカンダリ ドメインからメイン アプリケーション ドメインのメソッドを呼び出して値を取得する
C# IRC ボットのモジュール システムを実装しています。モジュールは、サブディレクトリ "modules" に格納されている .dll アセンブリであり、IRC に追加のコマンドを追加するなど、ボットに機能を追加するために使用されます。これらのモジュールは、実行時にロードおよびアンロードされるように設計されているため、アプリケーション全体を再起動することなく、ボットを更新したり、バグを修正したりできます。
現在、モジュール システムは、AppDomain
読み込まれるモジュールごとに新しい を作成しCreateInstanceFromAndUnwrap
、 というクラス内で使用してプロキシを作成しModuleHelper
ます。
このプロキシは から継承しMarshalByRefObject
ます。
OnLoad
OnUnload
モジュールがロードまたはアンロードされるときに呼び出されます。MarshalByRefObject
モジュールは、モジュール内のこのクラスなど、外部アセンブリ内のからも継承しますConfigurationReader.dll
。
問題は、メイン appdomain に属するものを変更すると (具体的には、新しいボットを IrcBot.Bots コレクションに追加するとIrcBot.Bots.Add(_configuration.Id, bot);
) IrcBot.Bots
、セカンダリ appdomain 内でのみカウントが増加し、必要なメイン appdomain では増加しないことです。 .
Console.WriteLining を少し実行したIrcBot.Bots.Count
後Add
、セカンダリ appdomain での呼び出しが 1 を返した後にOnLoad
呼び出し、メイン appdomain での呼び出しが 0 を返した直後にもう一度呼び出すことがわかりました。これは悲惨な結果をもたらし、他のモジュールを引き起こします後でロードされて誤動作します。セカンダリ AppDomain で変更した後、メイン AppDomain のボット数を (とりわけ) 更新するにはどうすればよいですか?
.net - MarshalByRefObject はどのように実装されていますか?
がどのように実装されているか、MarshalByRefObject
またリモート処理でオブジェクトを参照渡しできる理由を知りたいです。
クラスの実装が原因で可能ですMarshalByRefObject
か、それともリモーティング ライブラリは、クラスが から派生したかどうかをチェックするだけMarshalByRefObject
ですか?
c# - 元のタイプへの透過プロキシ
ContextBoundObject から継承されたクラスのインスタンスから作成された {System.Runtime.Remoting.Proxies.__TransparentProxy} 型のランタイム オブジェクトがあります。このクラスは、他のオブジェクトに対してイベントを発生させます。このプロキシ オブジェクトを元のオブジェクトに変換する必要があります。すべてのオブジェクトは、単一システムのデフォルトの AppDomain にあります。
それらを元のオブジェクトに変換する方法は? 同じメモリで実行している場合にプロキシが作成される理由
c# - 単純なクロスアプリオブジェクトのメモリリーク
クロスAppDomainオブジェクトを試していますが、非常に奇妙なことが1つ見つかりました。
MemoryStreamオブジェクトを割り当ててその参照を返す(呼び出し元によってすぐに破棄される)リモートメソッドを呼び出すと、GC.Collect()を呼び出した後でも、メモリ使用量が大幅に増加し、ドロップダウンしません。
毎回新しいStringまたはbyte[]オブジェクトを返す呼び出しメソッドでは、リークはありません。
メモリプロファイラーは、ほとんどのライブオブジェクトがタイプChar []およびString(MemoryStreamの場合)であることを示しています。
問題は-私は何かを誤解しましたか、そしてリモート呼び出しはMarshalByRefObjectから継承するほど単純ではありませんか?
c# - PowerShellから呼び出されたときにdllに透過プロキシをキャストできませんが、C#コンソールアプリでは成功します
新しいライブラリを生成し、その中でスクリプトを実行するオープンソースライブラリを作成しようとしています。PowerShellファイルの名前との名前を取得する静的メソッドがあります。このメソッドは、C#コンソールアプリから呼び出された場合は正常に実行されますが、実行されません。AppDomain
PowerShell
AppDomain
PowerShell
フュージョンログにこのエントリがあるため、dllが2番目のアプリドメインに読み込まれていることがわかります。
クラス宣言とコンストラクターは次のようになります。
コンストラクター内のそのメッセージは、C#コンソールアプリから実行するかPowerShellアプリから実行するかに関係なく、 CreateInstanceFromAndUnwrapを呼び出すと出力されます。
以下の静的メソッドでAppDomainPoshRunnerCreateInstanceFromAndUnwrap
に返された値をキャストすると、失敗が発生します。
PowerShellで実行すると、「透過プロキシをキャストできませんInvalidCastExcception
」というメッセージが表示されます。JustAProgrammer.ADPR.AppDomainPoshRunner
私は何が間違っているのですか?
xml - JAXB は、最初に包含によってマーシャリングし、その後の参照のために @XmlIDREF によってマーシャリングできますか?
クラスに注釈を付けて、マーシャラーが最初にオブジェクトに遭遇したときに適切な型の XML 要素を生成することができるかどうか疑問に思っていますが、それ以降のこのオブジェクトへの他の参照では、XML IDREF エントリが作成されますか?
.net - サーバー側リストから切断されたMarshalByRefObjectsを削除する
.Net Remotingでは、リモートオブジェクトのリストを作成した場合、リモート側が消えてリストアイテムの1つにアクセスしようとすると、例外が発生します。
世界の終わりではなく、すべてうまくいって、あなたはそれを捕まえることを試みることができます。
MarshalByRefObject
ただし、から切断されたものを削除しようとすると、が使用され、リストをクリーンアップできなくなるList<MarshalByRefObject>
ため、別の例外が発生します。List.Remove()
Object.Equals()
これは、オブジェクトのある種のローカルラッパーで解決する必要MarshalByRefObject
がありますか、それともよりクリーンなアプローチがありますか?
.net - MarshalByRefObjectとSerializableの混合
さまざまな情報源が
オブジェクトがMarshalByRefObjectから派生する場合、オブジェクト参照は、オブジェクト自体ではなく、あるアプリケーションドメインから別のアプリケーションドメインに渡されます。オブジェクトが[Serializable]でマークされている場合、オブジェクトは自動的にシリアル化され、あるアプリケーションドメインから別のアプリケーションドメインに転送されてから逆シリアル化され、2番目のアプリケーションドメインにオブジェクトの正確なコピーが生成されます。MarshalByRefObjectが参照を渡す間、[Serializable]によってオブジェクトがコピーされることに注意してください。[ソース]
AppDomainsを使用する最初のアプリを設計していますが、MarshalByRefObjectを実装していないシリアル化可能なオブジェクト内に参照を配置するとどうなるのでしょうかMarshalByRefObjects
。これまでのところ、このテーマに関するドキュメントが見つかりません。
たとえば、AppDomainの境界を越えてList<MBR>
whereを返そうとするとどうなりますか?それぞれが 元のオブジェクトMBR : MarshalByRefObject
のどこにあるかのコピーを取得できますか?また、2つのメカニズムの混合に関する技術的な詳細についてのドキュメントはありますか?List<MBR>
MBR
TransparentProxy
.net - MarshalByRefObject がローカルかリモートかを検出するにはどうすればよいですか?
つまり、TransparentProxy またはローカル オブジェクトへの参照があるかどうかをどのように判断すればよいのでしょうか?
c# - .Net 4インラインMarshalByRefObjectメソッドはありますか?
インライン化されていないメソッドに依存するコードがいくつかあります:
もちろん、これはDoSomethingメソッドがインライン化されていない場合にのみ機能します。これが、基本クラスがから派生する理由MarshallByRefObject
であり、パブリックメソッドのインライン化を妨げます。
これまでは機能していましたが、.Net 4サーバーからスタックトレースを取得し、スタックウォークがDoSomethingの呼び出し元に到達したことを示しています。
.Net 4インライン化はより巧妙であり、MyClassが内部であり、プロキシに置き換えられる可能性がないことを検出しますか?