【書籍】メタプログラミング .NET

  • 2013.08.30 Friday
  • 20:35
評価:
Kevin Hazzard,Jason Bock
アスキー・メディアワークス
¥ 3,360
(2013-08-29)

JUGEMテーマ:コンピュータ

楽しみにしていた一冊が手元に届きました。とはいっても、予約していたのに、すっかり忘れていたんだけど(笑)

--------------------------
まだ第一章しか読んでいないので帯に書かれている目次を羅列しておきます。

第1部 メタプログラミングの秘密のベールをはがす
 第1章 メタプログラミングの概念
 第2章 リフレクションでコードとメタデータを探る
第2部 コード生成のテクニック
 第3章 T4(Text Template Transformation Toolkit)
 第4章 CodeDOMを使ったコード生成
 第5章 Reflection.Emitによるコード生成
 第6章 式によるコード生成
 第7章 ILの書き換えによるコード生成
第3部 言語とツール
 第8章 DLR
 第9章 言語とツール
 第10章 .NETコンパイラを管理する
付録A Windows 8でのメタプログラミング
付録B 用途のガイドライン

という内容になっています。第4章から第7章の内容を楽しみにしています。前々から知りたかった内容だったのですが、ググってもなかなかお目当ての内容が見つからず・・・それらしきテクニックが使われているコードは何度も見かけては興奮したものですが、解説はない・・・・(笑)

【書籍】C#プログラマのための.NETアプリケーション最適化技法

  • 2013.08.27 Tuesday
  • 22:28
評価:
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー
翔泳社
¥ 3,780
(2013-07-23)

JUGEMテーマ:コンピュータ

自分には敷居が高すぎると思いつつも買ってしまいました。世の中にはこういう本を読んですぐに理解できるというか、既知だよねみたいな、すごく凄い人たちがいる訳なんですが、悲しいかな私は全く落ちこぼれプログラマなので、読んでもさっぱりわかりません。はい。でも、分かるところもあるので、とりあえず分かるところを広げていく努力くらいはしないと、この先生き残れない訳です。はい。がんばる。脳みそが筋肉痛になるくらいがんばります。

当Blogで何度も参照型と値型の違いがよくわかんないみたいな事書きましたが、「C#プログラマのための.NETアプリケーション最適化技法」という書籍には結構丁寧に解説があります。私が知る限りこの本が一番丁寧に解説されていると思います。

まだ3章までしか読んでないので、後の章はよく分かりません。でも、まあオススメの本です。これは良い。

【.Net Framaework】代理人が全部答えちゃうProxy

  • 2012.12.12 Wednesday
  • 23:18
JUGEMテーマ:コンピュータ

Source and Project

今回は、RealProxyが全部、クライアントに答えちゃうという実装をしたいと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
namespace Art55.ProxyDemo20121212_001
{
    public class MyProxy : RealProxy, IRemotingTypeInfo
    {
        static MyProxy()
        {
            OperationSet = new Dictionary<string, Func<double, double, double>>
                {
                    {"Add", (x, y) => x + y},
                    {"Multiply", (x, y) => x*y},
                };
        }
        private static readonly Dictionary<string, Func<double, double, double>> OperationSet;
        public MyProxy()
            : base(typeof(MarshalByRefObject))
        {
        }
        public override IMessage Invoke(IMessage msg)
        {
            var callMessage = (IMethodCallMessage)msg;
            if (OperationSet.ContainsKey(callMessage.MethodName))
            {
                object reusltValue = OperationSet[callMessage.MethodName]((double)callMessage.Args[0],
                                                                          (double)callMessage.Args[1]);
                return new ReturnMessage(reusltValue, null, 0, null, callMessage);
            }
            return new ReturnMessage(new NotImplementedException(), callMessage);
        }

        public bool CanCastTo(Type fromType, object o)
        {
            if (OperationSet
                .Keys
                .Any(key => fromType.GetMethod(key) == null))
            {
                return false;
            }
            var methodInfos = OperationSet
                .Keys
                .Select(fromType.GetMethod)
                .ToList();
            if (methodInfos
                .Any(m => m.ReturnType != typeof(double)))
            {
                return false;
            }
            return methodInfos
                .Select(m => m.GetParameters())
                .All(para => para.Length == 2
                             && para[0].ParameterType == typeof (double)
                             && para[1].ParameterType == typeof (double));
        }
        public string TypeName { get; set; }
    }
}

RealProxyの実装は、こんな感じです。Invokeメソッドが呼び出されると、あらかじめ定義しておいたメソッドAddやMultiplyのオペレーションを実行します。今回は、IRemotingTypeInfoインターフェイスも実装しまいた。

IRemotingTypeInfo.CanCastToメソッドを実装することで、対応する透過プロキシがキャスト可能かどうか判定してくれます。OperationSetのValueとチェックロジックが2重管理になっているのは、すこし力量不足感がただよっていますが、とりあえず実装してみました。

これをクライアントで使って見ると

using System;
namespace Art55.ProxyDemo20121212_001
{
    class Program
    {
        static void Main()
        {
            var realProxy = new MyProxy();
            var calculator = (ICalculator) realProxy.GetTransparentProxy();
            Console.WriteLine(calculator.Add(10, 11));
            Console.WriteLine(calculator.Multiply(10, 11));
            var calculator2 = (ICalculator2)realProxy.GetTransparentProxy();
            Console.WriteLine(calculator2.Add(20, 21));
            Console.WriteLine(calculator2.Multiply(20, 21));
        }
    }
    public interface ICalculator
    {
        double Add(double x, double y);
        double Multiply(double x, double y);
    }
    public interface ICalculator2
    {
        double Add(double x, double y);
        double Multiply(double x, double y);
    }
}

ICalculatorインターフェイスやICalculator2インターフェイスと、全くキャストできそうにもないインターフェイスをキャストして実行するコードが書けている事がわかります。もちろん、コンパイルは、継承関係になくても書けるわけですが、これを実行すると

21
110
41
420

と出力され、実行時に継承関係にないICalculatorインターフェイスやICalculator2インターフェイスでキャストして、メソッドが呼び出せていることが確認できます。もちろん「=」をオーバーライドしているわけでもないのは自明ですね。.NETの世界って不思議。

Source and Project

【.NET Framework】透過Proxyを通じて別のアプリケーションドメインのオブジェクトを操作する。

  • 2012.12.12 Wednesday
  • 21:20
JUGEMテーマ:コンピュータ

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);
        }
    }
    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

【.NET Framework】リアルProxyと透過Proxy

  • 2012.12.11 Tuesday
  • 21:36
JUGEMテーマ:コンピュータ

Source and Project

何度か調べた事があるのに、透過Proxyという言葉を私は、正しく理解していなかったようです。現状の理解では、利用する側、つまりクライアントが、Proxyを利用していると意識せずに利用されるProxyの事を、透過Proxyというのだと思っています。意識しないとは、Proxyを利用する為の決まった手続きをしないという事であって、調べてそれがProxyであるかどうか判定できないという意味ではないです。

Don Box著の「Essential .NET」に透過Proxyの実装が紹介されているので、その部分だけ取り出して、機能を減らした実装を組んでみると(ある程度、参考にしていますが、細かなところで違うかもしれません。MSDNなども参考にしたので)

using System;
using System.Runtime.Remoting.Proxies;
namespace Art55.AopDemo20121211_001
{
    public class MyProxyAttribute : ProxyAttribute
    {
        public override MarshalByRefObject CreateInstance(Type serverType)
        {
            var instance = base.CreateInstance(serverType);
            var proxy = new MyProxy(instance);
            return proxy.GetTransparentProxy() as MarshalByRefObject;
        }
    }
}

using System;
using System.Diagnostics;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Activation;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Services;
namespace Art55.AopDemo20121211_001
{
    public class MyProxy : RealProxy
    {
        public MyProxy(MarshalByRefObject target)
            : base(RemotingServices.GetRealProxy(target).GetProxiedType())
        {
            _target = target;
        }
        private readonly MarshalByRefObject _target;
        public override IMessage Invoke(IMessage msg)
        {
            var callMessage = (IMethodCallMessage)msg;
            Debug.Print(callMessage.MethodName);
            var ctor = callMessage as IConstructionCallMessage;
            if (ctor != null)
            {
                RealProxy realProxy = RemotingServices.GetRealProxy(_target);
                realProxy.InitializeServerObject(ctor);
                var transparentProxy = (MarshalByRefObject)GetTransparentProxy();
                return EnterpriseServicesHelper.CreateConstructionReturnMessage(ctor, transparentProxy);
            }
            return RemotingServices.ExecuteMessage(_target, callMessage);
        }
    }
}

MyProxyAttribute クラスは、属性としてMarshalByRefObjectを継承するクラスに指定すると、コンストラクタに割り込む事ができるクラスです。MyProxyAttributeを指定されたクラスのコンストラクタが呼ばれると、インスタンスが作成されたタイミングで透過Proxyが作成されるように実装されています。

MyProxy クラスは、メソッドが呼ばれたタイミングで呼び出しをIMessageで戻りをIMessage でメッセージをやりとりできるようにInvokeメソッドをオーバーライドさせています。動きを確かめたかったので、余計なことはせず通過するだけのシンプルな作りにしてみまいした。

で、透過Proxyとして利用したい「Calculator1 」クラスを用意します。ポイントはMyProxy属性を付けるだけ、

    [MyProxy]
    public class Calculator1 : ContextBoundObject
    {
        public double Add(double x, double y)
        {
            return x + y;
        }
        public double Multiply(double x, double y)
        {
            return x * y;
        }
    }

これをクライアント側で利用してみます。
とりあえずnewして利用してみます。

    class Program
    {
        static void Main()
        {
            var calculator = new Calculator1();
            Console.WriteLine(calculator.Add(10, 11));
            Console.WriteLine(calculator.Multiply(10, 11));
            Console.WriteLine(RemotingServices.IsTransparentProxy(calculator));
        }
    }

どこからどうみてもCalculator1クラスをnewして、そのインスタンスを利用しているだけに見えますが、calculator は透過Proxyになっています。

実行してみると

21
110
True

RemotingServices.IsTransparentProxy(calculator));がtrueを返しているので透過Proxyとなっていることがわかります。つまり、クライアント側は、それが透過Proxyであることを意識せずに、また、透過Proxyとなるような手続きを一際せずに利用していることがわかります。

といっても今回の動きを見たかっただけのコードでは、あんまり嬉しくないわけですが、もちっと勉強してから何か書いていきたいと思います。

Source and Project

【COM】Shell.Applicationを使ってみる。

  • 2012.12.10 Monday
  • 20:47
JUGEMテーマ:コンピュータ

完全にNetOfficeが関係なくなったので、カテゴリーは「.NET Framework」にしました。

COMを調べていたところ「Shell.Application」というものを利用してサンプルコードを書いているサイト様をよく見かけるので、自分もちょいと使ってみることにしてみました。

■起動しているエックスプローラーを表示する。

using System;
using System.Runtime.InteropServices;
namespace Art55.NetOfficeDemo20121210_002
{
    class Program
    {
        static void Main()
        {
            Type instanceType = Type.GetTypeFromProgID("Shell.Application");
            dynamic shellApplicaition = Activator.CreateInstance(instanceType);
            dynamic windows = shellApplicaition.Windows;
            foreach (dynamic window in windows)
            {
                Console.WriteLine(window.Name);
                Marshal.ReleaseComObject(window);
            }
            Marshal.ReleaseComObject(windows);
            Marshal.ReleaseComObject(shellApplicaition);
        }
    }
}

■ファイル名を指定して実行する。

using System;
using System.Runtime.InteropServices;
namespace Art55.NetOfficeDemo20121210_002
{
    class Program
    {
        static void Main()
        {
            Type instanceType = Type.GetTypeFromProgID("Shell.Application");
            dynamic shellApplicaition = Activator.CreateInstance(instanceType);
            shellApplicaition.FileRun();
            Marshal.ReleaseComObject(shellApplicaition);
        }
    }
}

他にもコントロールパネルを表示するとか、エックスプローラーでできそうな操作をCOMでオートメーション化できそうです。調べてみると面白いかも。C++やVBで書かれているサンプルコードがざくざく出てくるので、結構楽しいです(笑)

【雑記】実感が持てない。成功しない。など。

  • 2012.09.05 Wednesday
  • 20:09
JUGEMテーマ:コンピュータ
 
プログラミング .NET Framework 第3版を何度も読み返しているのですが、全く実感がないというか、何を読んだのかよく分からないというか、何が書かれていたのかよくわからないというか・・・・そんな感じ・・・ノートを用意して、自分でまとめた方が良いのかな・・・。と思う今日この頃。

【.NET Framework】C#の型とCLRの型

  • 2012.08.18 Saturday
  • 15:54
JUGEMテーマ:コンピュータ

C#の型とCLRの型では、意味が違うのかな?

文脈によって意味は変わるだろうと突っ込まれることを覚悟してあえて書いてみました。

【.NET Framework】.NET Frameworkの中身を知りたい!

  • 2012.08.15 Wednesday
  • 00:39
JUGEMテーマ:コンピュータ
 
グラフについて体系的にしりたいな〜!

アルゴリズムの勉強をしよ!

ソートおもしろいね!

あれ?特定のデータ構造対してのソートアルゴリズムかー!?

あれ?配列ってよくわかってないんじゃない>自分

とりあえず家に転がってる本の配列が書かれてる部分よんでみよ。

実行時の配列ってメモリ上ではどうなってるんだろう・・・。

そもそもアプリケーションの実行時ってどういう風になってるんだろう・・・。

読んでも意味が分からなかった本発見!「プログラミング .NET Framework 第3版」(2版も持ってます!)

読んでも意味が分からなかった本発見!「The Root of .NET Framework .NETアプリケーションの解析手法とデバッグの実践」

読んでも意味が分からなかった本発見!「Essential .NET 共通言語ランタイムの本質」

過去に挫折した本を3冊を見比べながら読み回してます <- 今ここ!



当ブログは「プログラミング関連Blog 私の興味の端から端までをお届けします!」

以上

【C#】LINQを使って見て数年・・・

  • 2012.01.14 Saturday
  • 15:50
「LINQ」を使い初めてからバグコードを書く頻度が減った(ような気がする)ことに、最近、気づきました。なんでしょうね。

心当たりはあるのですが、残念、文章でまとめられない。

calendar

S M T W T F S
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< September 2018 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM