問題タブ [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.
plugins - MarshalByRefObject でラップして参照をリモート化しますか? それはうまくいきますか?
MAF を使用してプラグイン システムを実装しようとしています。私が現在渡したいオブジェクトはシリアライズ可能ではありません。シリアライズ可能にできると確信していても、非常にパフォーマンスが高いとは思いません。
2 つの質問:
1) MAF が実際の参照を渡すために、オブジェクトは単に MarshalByRefObject から継承する必要がありますか、それともそれ以上のものがありますか?
2) MarshalByRefObject から継承するオブジェクトでクラスをラップして、参照を取得できますか?
編集:明らかに、問題自体はMAFとはほとんど関係がありませんが、誰かが私を完全な方向に向けることができる場合に備えて、いくつかのコンテキストを含めたかっただけです.
c# - SCardGetCardTypeProviderNameは空の結果を返します
C#で相互運用機能を使用してSCardGetCardTypeProviderNameを使用しようとしています。パラメータの1つは参照です。これは、渡されたカードコンテキストに従って、スマートカードのプロバイダーの名前を返すことになっています。これは、私が使用しているコードです。
ただし、providerNameは常に空に戻りますが、providerNameLengthは43に変更されるため、マーシャリングの問題だと思います。しかし、私はproviderNameを次のようにマーシャリングしようとしました:
- LPWStr
- LPTStr
- LPStr
後者の2つの場合、空の文字列の代わりに、奇妙な文字列が表示されます。これも、マーシャリング/翻訳の問題だと思います。
appdomain - MarshalByRefObject でイベントをサブスクライブ中に FileNotFoundException が発生する
AppDomains を使用するアプリケーションがあります。メイン アプリケーション A (B が読み込まれたアセンブリがありません) からフォーム B を作成し、そのフォームにオブジェクトを渡します。次に、この someObject.eventName += メソッドのようにしようとしていますが、NotFoundException が発生し、「ファイルまたはアセンブリ名 ''、またはその依存関係の 1 つが見つかりませんでした」というメッセージが表示されます。someObject.Item = value は例外を与えません。
DataWrited del = 新しい DataWrited(_logger_DataWrited); // 例外なく
_logger.DataWrited = デル; // += と同じ例外を与える
すべてのアセンブリはベース フォルダにあり、アクセス可能です
PS 下手な英語でごめんなさい
Bで実装したメソッドをAで使おうとしたところ、ofc例外が発生しました。
vb.net - vb.net オブジェクト byref をアンマネージ コードに渡す
アンマネージドvc++コードで処理されているマネージドvb.netコードからイベントを発生させています。以下はコード行です:
pCALMarkupsオブジェクトは参照として渡され、アンマネージ vc++ コードで初期化されます。以下は、VB.NET でのイベントの宣言です。
以下は、 VC++でこのイベントを処理している関数です。
コードのデバッグ中にOnRequestEISDataViewer関数にステップインできます。その関数内のすべてがエラーなしで実行されていますが、最後の行を実行した後に制御が関数から出てくると、以下のエラーが表示されます。
「マネージド デバッグ アシスタント 'InvalidVariant' は 'D:\Shared Folder\Workman code\UI\bin\WorkMan.exe' で問題を検出しました。追加情報: アンマネージド バリアントからマネージド オブジェクトへの変換中に、無効なバリアントが検出されました。無効な VARIANT を CLR に渡すと、予期しない例外、破損、またはデータ損失が発生する可能性があります"
では、 VB.NETコードでpCALMarupsオブジェクトをストロング タイプまたはマーシャリングして、このエラーを解決するにはどうすればよいでしょうか。または vc++ コードを変更する必要がありますか? どんな提案でも大歓迎です。
c# - デリゲートが別の AppDomain に渡されるときにプロキシとしてマーシャリングすることは可能ですか?
どういうわけか、別の AppDomain に渡されたデリゲートは、あたかも から派生したオブジェクトであるかのようにプロキシになると想定しましたMarshalByRefObject
。残念ながら、そうではないようです。
私のコードで、次のMyClass
ようなクラスがあるとしましょう:
のインスタンスMyClass
を別の AppDomain に渡す必要があります。
問題は、 に格納されているデリゲートに、ほとんどすべてのメソッドへの参照が含まれる可能性があることです。これには、から派生したものSomeDelegate
でもない型のインスタンスのメソッドが含まれる可能性があります。[Serializable]
MarshalByRefObject
この質問のために、デリゲートを作成するコードを変更することもMyClass
、MarshalByRefObject
. ただし、[Serializable]
です。
(MyClass
から派生した型のフィールドが含まれている場合MarshalByRefObject
、そのフィールドに格納されているオブジェクトはプロキシに変換され、クラスの残りの部分はシリアル化されることに注意してください。)
クラスをシリアル化されたものとして渡すことができるようにするためにできることはありMarshalByRefObject
ますか? (できれば AppDomain のセットアップで変更するMyClass
必要がないようにしますが、デリゲートを作成するコードを変更する必要がない限り、クラスの変更を伴う提案も歓迎します。)
c# - applicationBase C#の外部の AppDomain にアセンブリをロードする
そのため、最近、アプリケーション(または実行可能ファイル、あなたがそれを何と呼んでも)が、実行可能ファイルのフォルダー内にまったく見つからないアセンブリをロードおよびアンロードできる必要があるプロジェクトに取り組んでいます。(別のドライブの場合もあります)
例として、アプリケーションをD:\AAA\theAppFolderに配置し、DLL ファイルのアセンブリをC:\BBB\Assembliesに配置できるようにしたいと考えています。
徹底的に調べたところ、 AppDomainは自分自身とアタッチされたアセンブリをアンロードできることがわかったので、試してみようと思いましたが、数時間試行した後に問題があるようです: AppDomains は、アプリケーションベース。
AppDomain のドキュメンタリー (および私自身の経験) によると、 PrivateBinPath を ApplicationBase の外に設定することはできません。また、アプリケーションが存在するドライブの外に ApplicationBase を設定すると (AppDomainSetup を介して)、System.IO.FileNotFoundExceptionを取得できません。アプリケーション自体を見つけます。
そのため、AssemblyResolve ResolveEventHandler を使用して MarhsalByRefObject 継承クラスを使用してアセンブリを取得しようとするフェーズに到達することさえできません...
ここに、私が現在試みていることに関連するコードのスニペットをいくつか示します
できる限り具体的に言うと、アプリケーションのベースフォルダー内にないアセンブリをロードするために、アンロード可能な AppDomain を取得する方法はありますか?
c# - 複数のコピーを作成する MarshalByRefObject を使用する C# プラグイン
これらの要件を持つプラグイン フレームワークをまとめています。
- 自由にプラグインをロード/アンロード
- 読み込まれたプラグインのメソッドを呼び出す
- プラグインから所有者へのコールバック イベントを発生させる
これを行うには、新しい AppDomain を作成し、プラグイン アセンブリをこれにロードします。
これまでの実装はある程度機能していますが、ローカルの appDomain と新しい AppDomain にプラグインのインスタンスを作成していると思います。
最初にロードすると、コールバック メッセージが重複して表示されます。複数回ロード/アンロードすると、複数のコールバック メッセージがリストに追加されます。これは、リモートだけでなくローカルでもプラグイン アセンブリをロードしているため、「アンロード」メカニズムが期待どおりに動作していないことを示しています。誰かが私が間違っている場所を教えてくれたらありがたいです。
また、プラグインの「寿命」を考慮する必要があることも理解していますが、これを実装する場所がわかりません。
ありがとう。
(1) プラグイン インターフェイスがあります
(2) カスタムイベント引数
(3) プラグインクラスの実装例
(4) ロード/アンロードするプラグイン マネージャがあります
public bool LoadPlugin() { try { Domain_Command = AppDomain.CreateDomain("Second_domain"); command_loader = (ProxyLoader)Domain_Command.CreateInstanceAndUnwrap("PluginMgr", "PluginMgr.Method"); Plugins.AddPlugin(command_loader.LoadAndExecute("APluginName", Plugins.ProxyLoader_RaiseCallbackEvent), SomePluginType, false);
true を返します。
} catch (Exception ex) { 文字列メッセージ = ex.Message; false を返します。} }
(5) プラグインを別の AppDomain にロードするための「ProxyLoader」
(6) これがプラグインするコールバックがあります
(7) によって呼び出されます (アセンブリをロードするときに ProxyLoader で参照されます)
.net - リモーティング オブジェクトの有効期限にフックできますか?
から継承するクラスがありMarshalByRefObject
、その中でライフタイム サービスをオーバーライドしてInitialLeaseTime
2 時間の値を与えています。
ここで、リースの有効期限が切れたときにいくつかのロジックを実行したいと考えています。有効期限にイベントまたはフックはありますか? Google と MSDN を検索しましたが、何も見つかりませんでした。
ありがとう!