タグ

ブックマーク / saiya-moebius.hatenadiary.org (2)

  • RealProxy (実プロクシ) と透過的プロクシと IRemotingTypeInfo - やこ〜ん SuperNova2

    CLI(や CLR) は、通常はスタックベース*1の世界でメソッド呼び出し*2を処理している。しかし、CLI にはそれらスタックベースの処理を、メッセージと呼ばれるオブジェクトを受け渡す形に変換する機構が備わっている。 どのような機構かと言うと、透過的プロクシと呼ばれるものがあり、この透過的プロクシは普通のオブジェクトインスタンスの如く振る舞う。が、透過的プロクシに対するメソッド呼び出し(など)は、CLR によって実プロクシと呼ばれるものに委譲され、実プロクシで煮るなり焼くなりすることが出来てしまうのである。 System.Runtime.Remoting.Proxies.RealProxy 具体的には、RealProxy というクラスを継承&実装することでこの機構を使うことが出来る。 RealProxy は実プロクシを作るための基底クラスであり、 public virtual objec

    RealProxy (実プロクシ) と透過的プロクシと IRemotingTypeInfo - やこ〜ん SuperNova2
  • インスタンスが属するクラスをあとから変更する操作を C# で 〜RealProxy バージョン〜 - やこ〜ん SuperNova2

    元ネタ インスタンスが属するクラスをあとから変更する操作をいろいろな言語で - Smalltalkのtは小文字です C#と諸々 インスタンスが属するクラスをあとから変更する操作を C# で 概要 元ネタにある C# 版では、オブジェクトへの参照が持っている型ハンドルを強引に書き換えることにより、CLR が内部で持っている「このオブジェクト参照の実体はどの型なのか」という情報を改ざんし、それによって「インスタンスが属するクラスをあとから変更する操作」を実現している。 が、元ネタのエントリのコメント欄で id:NyaRuRu さんがツッコンでいる通り、この方法は CLI の実装に思いっきり依存する上、ランタイムの非公開なデータ構造を弄っているため挙動が無保証である。 そこで、RealProxy と IRemotingTypeInfo を用いる事で、ランタイム*1を破壊せずに「インスタンスが属す

    インスタンスが属するクラスをあとから変更する操作を C# で 〜RealProxy バージョン〜 - やこ〜ん SuperNova2
  • 1