【.NET Framework】透過Proxyを通じて別のアプリケーションドメインのオブジェクトを操作する。
- 2012.12.12 Wednesday
- 21:20
JUGEMテーマ:コンピュータ
Source and Project
昨日、書いた透過プロキシつながりで、記事を書いています。かなり適当です。
MarshalByRefObjectを継承させたクラスのインスタンスであれば、別のアプリケーションドメインからでも透過プロキシを通して操作することができるようです。
using System;
using System.Reflection;
using System.Runtime.Remoting;
Source and Project
昨日、書いた透過プロキシつながりで、記事を書いています。かなり適当です。
MarshalByRefObjectを継承させたクラスのインスタンスであれば、別のアプリケーションドメインからでも透過プロキシを通して操作することができるようです。
using System;
using System.Reflection;
using System.Runtime.Remoting;
namespace Art55.AppDomainDeom20121212_001
{
class Program
{
static void Main()
{
AppDomain appDomain = AppDomain.CreateDomain("別のドメイン");
var hoge = (Hoge)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Hoge).FullName);
hoge.Say();
Console.WriteLine(RemotingServices.IsTransparentProxy(hoge));
AppDomain.Unload(appDomain);
}
}
{
class Program
{
static void Main()
{
AppDomain appDomain = AppDomain.CreateDomain("別のドメイン");
var hoge = (Hoge)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, typeof(Hoge).FullName);
hoge.Say();
Console.WriteLine(RemotingServices.IsTransparentProxy(hoge));
AppDomain.Unload(appDomain);
}
}
public class Hoge : MarshalByRefObject
{
public void Say()
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
}
}
}
AppDomain.CurrentDomainは現在実行中のスレッドが属するドメインを取得するプロパティなので、Say()メソッドが呼ばれると、そのドメインのFirendyNameが表示されることになります。実行すると
別のドメイン
True
また、RemotingServices.IsTransparentProxy(hoge))でhogeインスタンスが透過プロキシであるかどうかを判定しています。実行結果を見る限り、透過プロキシになっていることがわかるので、今回のプログラムを実行すると
カレントのアプリケーションドメインから別のアプリケーションドメインを作成する。
別のアプリケーションドメインにhogeオブジェクトを作成する。
hogeオブジェクトを参照する透過プロキシをカレントのアプリケーションで取得する。
プロキシを通してSayメソッドを別のアプリケーションドメインで実行する。
別のアプリケーションドメインをアンロードする。
という流れになっていることが分かります。
シリアライズしてドメイン間を値のコピーでやりとりする方法もあるみたいですが、それはまた今度。
Source and Project
{
public void Say()
{
Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
}
}
}
AppDomain.CurrentDomainは現在実行中のスレッドが属するドメインを取得するプロパティなので、Say()メソッドが呼ばれると、そのドメインのFirendyNameが表示されることになります。実行すると
別のドメイン
True
また、RemotingServices.IsTransparentProxy(hoge))でhogeインスタンスが透過プロキシであるかどうかを判定しています。実行結果を見る限り、透過プロキシになっていることがわかるので、今回のプログラムを実行すると
カレントのアプリケーションドメインから別のアプリケーションドメインを作成する。
別のアプリケーションドメインにhogeオブジェクトを作成する。
hogeオブジェクトを参照する透過プロキシをカレントのアプリケーションで取得する。
プロキシを通してSayメソッドを別のアプリケーションドメインで実行する。
別のアプリケーションドメインをアンロードする。
という流れになっていることが分かります。
シリアライズしてドメイン間を値のコピーでやりとりする方法もあるみたいですが、それはまた今度。
Source and Project