2008年09月28日

WcfSvcHostを起動しないようにする

   このエントリーをはてなブックマークに追加 Clip to Evernote
Visual Studio 2008でWCFの勉強をすために、ここを参照しながら、自分でもプログラムを作ってみたのだけど、なぜか、WindowsFormsのホストプログラムで例外が発生してしまう。
WcfSvcHostというプログラムが、デバッグ時に自動で起動されてしまうのが原因のようだ。

もともと、WindowsFormsのホストプログラムは確認用なのだから、このプロジェクトそのものを使わなければいいのだが、初めてなので、上記記事の通りに進めてみたい。

いろいろ調べたところ、WCFサービスプロジェクトのcsprojファイル内の、タグから{3D9AD99F-2412-4246-B90B-4EAA41C64699} を削除すれば良いようだ。
こうすることで、WcfSvcHostが起動しなくなる。

参考URL
Visual Studio 2008 のデバック時にWcfSvcHost.exeによりWCFサービスが自動でホストされないようにする」  

Posted by gushwell at 20:56Comments(0)TrackBack(0)

2008年09月26日

Ctrl + Alt + ↓キー

   このエントリーをはてなブックマークに追加 Clip to Evernote
「Visual Studio 2008 ワンポイントメモ」のこの記事に、

ファイル メニューのドロップダウンを表示するには、Ctrl + Alt + ↓キーを押します。

とあるので、やってみたら、このキーはディスプレイドライバーで別の機能にアサインされていた。
なんと、ディスプレイの表示が 180度回転した。いやーびっくり!。
  
Posted by gushwell at 21:04Comments(4)TrackBack(0)

2008年09月24日

MTOM

   このエントリーをはてなブックマークに追加 Clip to Evernote
.NET Framework 3.0には、XmlDictionaryReader と XmlDictionaryWriterクラスが、
System.Runtime.Serialization アセンブリに追加されています。
WCFのために導入されたクラスっぽいです。
で、XmlDictionaryWriterクラスには、CreateMtomWriter というメソッドがあるんだけど、MTOMって初めて聞きました。
Message Transmission Optimization Mechanismの略らしいです。
こんな規格があったんですね。

以前、Webサービス(.NET同士での通信)で、データを送る際に効率を上げようと独自
にバイナリーを送るような実装をしたことがありましたが、これを使えばそういった必要はないのかな?
深くは調べていないので、よくわかりません。  
Posted by gushwell at 20:49Comments(0)TrackBack(0)

2008年09月17日

ThreadStaticAttribute

   このエントリーをはてなブックマークに追加 Clip to Evernote
ThreadStaticAttribute こんな属性があることを知らずに、スレッド毎に一つのインスタンスが保障されるコードを一生懸命C#で書いていました。
会社の後輩にこの属性があることを教えてもらったので、備忘のために書いておきます。
  
Posted by gushwell at 21:14Comments(0)TrackBack(0)

2008年09月14日

C#デザインパターン

   このエントリーをはてなブックマークに追加 Clip to Evernote
『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』に掲載されているサンプルコードをC#に移植したものを、以前このブログで公開しましたが、現在、こちら(Gushwell's C# Programing Page)への引越し作業中です。
引越しついでに、C#3.0に書き換えています。
現在、13個のパターンを掲載しています。
  
Posted by gushwell at 20:44Comments(2)TrackBack(0)

2008年09月11日

インターフェースを実装しているかを調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
今度は、ICollectionを実装しているかを調べるコードをC#で書いてみた。
type.GetInterfaceMap(typeof(System.Collections.ICollection));

として例外が出なければOK。

もう一つの方法は、
GetInterface("System.Collections.ICollection");
で、null 以外が返ればOK.

じゃあ、IEnumerable<> を実装しているかを調べるには?
IEnumerable<int> でもIEnumerable<string>でも、なんでもOKにしたい。

 type.GetInterfaceMap(typeof(IEnumerable<>));
とやったけど、ダメだった。
指定したインターフェースが見つからないと、実行時例外が発生してしまう。
こうすれば、できるようだ。

 bool IsGenericsIEnumerable(Type type) {
     foreach (var t in type.GetInterfaces()) {
        if (t.IsGenericType && 
            t.GetGenericTypeDefinition() == typeof(IEnumerable<>) )
            return true;
     }
     return false;
 }

LINQを使えば、
 bool IsGenericsIEnumerable(Type type) {
     return type
         .GetInterfaces()
         .Any(t => t.IsGenericType && 
             t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
 }


と書ける。
  
Posted by gushwell at 21:39Comments(6)TrackBack(0)

2008年09月08日

Listかどうかを調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
今度は、ある型が、Listのオブジェクトだということを判断するコードをC#で書いてみる。 配列の場合は、Type.IsArray プロパティが用意されているけど、 IsListはさすがに用意されていない。 最初に書いたコードは以下の通り。

 void IsList(Type type) {
    return type.Name == "List`1" &&
           type.Namespace == "System.Collections.Generic";
 }

なんか、イケてない。
次は、試行錯誤でたどり着いたコード。

 return type.GetGenericTypeDefinition() == typeof(List<>);

このほうが良いな。
そのオブジェクトが取得できるならば、

   obj is List<int>

のようにすれば、通常は問題ない。 でも、要素の型が分からない場合は、
   obj is List<>  // コンパイルエラー

とは書けない。残念だ。
じゃあ、要素の型を見つけるにはどうするのだろうか? 調べたところ、以下のコードで見つけられた。
 Type elementType = type.GetGenericArguments()[0];
  
Posted by gushwell at 21:49Comments(2)TrackBack(0)

2008年09月03日

配列かどうかを調べる

   このエントリーをはてなブックマークに追加 Clip to Evernote
bool IsArray(Type type) { }

このメソッドの中で、typeが、配列オブジェクトだということを判断するには、C#でどういうコードを書けば良いのだろうか?


初めに書いたコード

  return type.BaseType.FullName == "System.Array";

次に書いたコード

  return type.BaseType == typeof(System.Array);

要素の型は、

  Type elementType = type.GetElementType();

で求められる。

もちろん、is 演算子が使える場面では、こんな面倒なことをする必要はない。
以下のように書けばよいだけだ。

int[] num = new[] { 1, 2, 3, 4, 5 };
if (num is Array)
Console.WriteLine(true);


9/5追記

配列かどうかは、

type.IsArray

だけでよかった。
(よこけんさんに教えてもらった)
  
Posted by gushwell at 20:52Comments(4)TrackBack(0)