問題タブ [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# - アセンブリをロードするときの競合する依存関係
プラグイン ハンドラを作成しようとすると、いくつかの問題が発生します。
「AssemblyX」を参照するメインアプリケーション「AppA」があります。
AppA は、「IPlugin」インターフェイスを実装する多数のプラグイン アセンブリも読み込みます。ただし、これらのプラグインは「AssemblyX」を参照することもあり、古いバージョンである場合もあります。
したがって、最初の問題は、Assembly.LoadFrom() を介してプラグインをロードするときに発生した AssemblyX との競合でした。
ここで少し調査した後、新しい AppDomain にプラグインをロードしてみました。これだけでは問題は解決しませんでした。次に、MarshalByRefObject から継承した ProxyDomain クラスを作成しました。まだ喜びはありません。
最後に、プラグイン自体を MarshalByRefObject から継承するようにしました。これにより、より多くの成功が得られましたが、List を ListView にバインドしようとすると、「System.MarshalByRefObject」には「SomeProperty」という名前のプロパティが含まれていないと不平を言いました。
誰かが私のコードに目を向けて、変更が加えられるかどうかを確認してください:
注: PluginExamples.dll には、複数のプラグイン クラスが含まれている場合があります。
c# - AppDomain から参照されるオブジェクトのローカル インスタンスの作成
アプリドメインから参照されているオブジェクトのローカルインスタンスを作成する方法があるかどうかを調べようとしています. そのため、常にリモート オブジェクトを呼び出す必要はなく、メソッド内で作成されたローカル インスタンスを呼び出すだけで済みます。
RemotingServices Marshal および GetObjectData メソッドを見てきましたが、それらが機能するかどうかを判断できず、Google も役に立ちませんでした
したがって、クラス定義は次のようになります
そして、実行時のクラスのインスタンスは次のようになります。
次の行に沿って必要なことを達成したいと思っていました
GetRealObject を呼び出すと、 「保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。」というエラーが表示されます。
私はまだこれを実装する方法を見つけていません。誰か提案がありますか?
c# - C++ を使用して C# を呼び出すときに、別のアプリケーション ドメインにオブジェクトを作成できない
出力タイプが netmodule の C# コードを作成しました。これは C++ コードで使用されています。
既に読み込まれている同じアセンブリのオブジェクトを作成したいと考えています。ただし、別の AppDomain で。しかし、これを行うと、アセンブリを読み込んで CreateInstanceAndUnwrap メソッドを使用してオブジェクトを作成することができません。スタンドアロンの C# コードを使用して同じことをしようとすると、正常に動作します。
C++:
C#
AssemblyName を出力したところ、C++ コードからコンパイルされた dll の名前として見つかりました。スタンドアロンの C# から試した場合は、exe の名前でした。
C++ と C# を一緒に使用する場合、これは AppDomain を作成する適切な方法ですか? または、AppDomain の作成を間違えました。手伝ってください。
c# - アプリドメインの使用時に同期コンテキストを設定できない
ホスト アプリケーションがイベント ループを実行し、ゲスト アプリケーションを別のアプリケーション ドメインにロードするカスタム フレームワークがあります。ゲスト アプリケーションには、提供された API を介してイベント ループを利用する手段があります。.NET GUI アプリケーションや UI スレッドで行われるように、ゲスト アプリケーションがすべての継続をイベント ループに自動的に伝達できるようにしたいと考えています。したがって、それが可能なカスタム同期コンテキストを作成します。
しかし問題は、この新しいコンテキストを使い始めることができないことです。設定しようとするとnull
、アプリ ドメインの境界を越えた次のコールバックでリセットされます。
問題を説明するための簡単なコード スニペットを次に示します。
出力:
SynchronizationContext.SetThreadStaticContext
デスクトップで利用できる場合、上記の問題を潜在的に解決できるこの方法もあります。
もちろん、他の作業を行う前に、各コールバックでコンテキストを明示的に設定する方法が常にあります。しかし、それは少しお粗末なようです。それに加えて、このニワトリが先か卵が先かという問題を解決するエレガントな方法が見当たりません。ちなみに、Monoでは期待どおりに動作します。
c# - リモート処理によって呼び出される MarshalByReferenceObject 内の発信者 ID
MarshalByReferenceObject
そのメソッドは .net リモート処理を介して呼び出されます。
クライアントは次のようにサーバーを呼び出しています。
デバッグの目的で、クライアントが DoSomething() メソッドを呼び出したときに、実際の呼び出し元が誰であるかをログに記録したいと思います。
server.DoSomething() 関数内から呼び出し元のメソッドを特定するにはどうすればよいですか? または、Activator.GetObject によって呼び出されるサーバー コンストラクター内からですか?
理想的には、どのクライアント メソッドがサーバーを呼び出したか、どの親メソッドがそのクライアント メソッドを呼び出したかなど、スタック トレース全体が必要です。しかし、私はある種の発信者識別に落ち着くでしょう。クライアントは私が管理しているので、どうにかして名前を付けることができますか? インターフェイスの仕様はすでにかなり決まっているので、そうでなければ余分なstring callerId
パラメーターをすべてのメソッドに追加することは避けたいと思います。
もちろん、ローカル スタック トレースはSystem.Runtime.Remoting
メソッドのみを識別し、実際のリモート呼び出し元は識別しません。
サーバー側のスタックトレースの例:
これは明らかに、クライアントからの呼び出しメソッドを識別するのに役立ちません。
c# - marshal_by_reference 警告が表示されるのはなぜですか
これが私のコードの簡略版です:
警告は次のとおりです。
「Master.TradingPausedDT」のメンバーにアクセスすると、参照によるマーシャル クラスのフィールドであるため、エラーが発生する場合があります。
この警告が表示されるのはなぜですか?
c# - 信頼されていないコードで MarshalByRefObject.InitializeLifetimeService をオーバーライドできますか?
サンドボックス化された AppDomain にアセンブリをロードするためのコードがいくつかあります (PermissionSet は PermissionState.None で初期化されます)。メインの AppDomain とサンドボックス化された AppDomain のアセンブリにデータをやり取りしたいと考えています。私のデータをMarshalByRefObject拡張することで、参照渡しが可能になります。問題は、これらのオブジェクトがメモリ内でハングアップすることです。できるだけ早く(ほとんどの場合数秒以内に)収集してもらいたいと思います。InitializeLifetimeServiceをオーバーライドしようとすると、ランタイム エラーが発生します。
この問題を示すサンプル コードをまとめました。私のコードは 3 つのプロジェクトに編成されています。
クラス ライブラリ: サンドボックス(これは署名する必要があります)
ファイル名: Sandbox.cs (このスタックオーバーフローの回答に基づく)
クラス ライブラリ: プラグイン
ファイル名: Plugin.cs
ファイル名: SharedData.cs
コンソール プロジェクト: 例
ファイル名: Program.cs
Sandbox.CreateInstance
を呼び出す回線でエラーが発生しますthis.assembly.GetType()
。私が受け取るメッセージは次のとおりです。
メンバー 'Plugins.SharedData.InitializeLifetimeService()' のオーバーライド中に継承セキュリティ ルールに違反しました。オーバーライドするメソッドのセキュリティ アクセシビリティは、オーバーライドされるメソッドのセキュリティ アクセシビリティと一致する必要があります。
InitializeLifetimeService には、信頼できないプラグインに与えるよりも多くのセキュリティが必要なようです。プラグイン ライブラリの外部で SharedData クラスを定義し、それを渡そうとすると (参照によってオブジェクトをマーシャリングしようとすると)、同様のエラーが発生します。
値によるコピーとシリアル化に頼らずにこれを機能させる方法はありますか?
編集:参考までに、シリアル化を使用することになりました。特にデータが変更され、それを返すために再度シリアル化する必要がある場所では苦痛ですが、少なくとも機能します。マーシャリングでこれを機能させることができるかどうか知りたいです。
c# - GetTypes を使用せずに X から継承するメイン クラスを見つけますか?
プラグインをオンデマンドでロードする (AppDomain と MarshalByRefObject を使用する) アプリケーションがあり、プラグインを検証する別の方法を見つけようとしています。
現在、次のような実行可能なプラグインを特定しています。
ただし、プラグインの 1 つが難読化されている場合、GetTypes は即座に失敗します。
したがって、この方法では、難読化されたプラグインと難読化されていないプラグインの両方を実行することはできません。
これが機能するためには、プラグインがインターフェースのインポートされたメソッドとメインクラスを難読化しないようにする必要があることを理解しています。
つまり、難読化された型の読み取りに失敗する GetTypes を使用せずに、前述の 2 つのインターフェイス (IPlugin または IPluginChat) のいずれかを継承するメイン クラスを見つける方法はありますか?