1

MEMORYでのdllのリモート処理に関連する高度な質問があります。Dlls(Starter.DLL entryType)を使用するwcfサービスがあります。また、wpfアプリケーションを参照するProcessdllもあります。私にはいくつかのステップがあります:

1)wcfはDLLを取得します(ストリームメモリに追加します。)

2)wcfから読み取ったdllを処理します

3)プロセスdllはdllをcurrentdomainに追加します


 foreach (byte[] binary in deCompressBinaries)
                        {
                            AppDomain.CurrentDomain.Load(binary);
                        }

4)wpfはプロセスのCreateApplicationメソッドにアクセスします


  this._btnStartApp.Click += (s, args) => 
            {
               Process appMngr = new Process ();
                appMngr.CreateApplication();
            };

CreateApplicationメソッド:


  object obj = appLoader.CreateInstance(appLoader.EntryType);
            MethodInfo minfo = obj.GetType().GetMethod("Execute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance);

しかし、QuickWatchingの場合、getMethosの結果にExecuteメソッドが表示されません。別の現在のドメインでExecuteメソッドを実行する方法は?このDLLは、wpfcurrentdomainではなくProcessDllのcurrewntdomainを追加しています。

ここに画像の説明を入力してください

4

1 に答える 1

1

AppDomainは、DLLを動的にロードして操作するのが難しいです。

初め; メソッドが表示されない場合は、オブジェクトのタイプを取得できることを確認してください。タイプが表示されている場合は、オブジェクトを現在のドメインにロードする必要があります。次に、メソッドを繰り返し調べて、GetMethod呼び出しと一致しないものがないかどうかを確認します。これにより、メソッドが表示されなくなる可能性があります。CreateInstanceフラグが問題になる可能性があります。コンストラクターに使用されていると思います。

2番; 別のappdomainで実行したい場合(後でdllをアンロードする場合は非常に重要です)、3つのものをビルドする必要があります。

  1. ダイナミックDLLのすべてのロードと実行を処理できるクラスのセットを作成します。

  2. メインコードがこのクラスのセットと通信できるようにするインターフェイスを作成します。このiterfaceは、ダイナミックDLLからのタイプを返すことはできません。そのDLLを実行するか、クラッシュする場合。refによるマーシャルが必要かもしれないことを思い出しますが、不確かで、それはしばらくの間です。

  3. メインのAppdomainにイベントハンドラーをアタッチして、DLLをそのappdomainにロードしたときに通知します。これは、DLLを現在のAppDomainに誤ってロードしている場合にデバッグする方法になります。 http://msdn.microsoft.com/library/system.appdomain.assemblyload.aspx

これで、新しいAppdomainを作成し、そこでロードコードを呼び出して、インターフェースを介して結果を取得できます。通話を完了でき、ロードイベントがトリガーされていない場合は、通話を機能させることができます。完了し、ロードされたDLLがそれに沿って移動したら、AppDomainを一時停止できます。

幸運を祈ります。これを理解して正しく機能させるのは難しいことでした。

于 2012-05-26T08:41:42.603 に答える