2008年1月11日 (金)

.NET Framework のリソース開放基礎(2)

.NET Frameworkのリソース開放は非常に難解です。

今回は重要メソッドである以下の2つについて説明します。

・Dispose(リソースを開放できるメソッド、自動で呼ばれることはない
・Finalize(リソースを何時か開放するメソッド、自動で呼ばれる

続きを読む ".NET Framework のリソース開放基礎(2) "

05:08 午後 .NET | | コメント (0) | トラックバック (0)

2007年12月31日 (月)

.NET Framework のリソース開放基礎(1)

ガベージコレクタがあるからリソースの開放は不要、という説は間違いです。

ガベージコレクタが開放できるのは、.NET FrameworkのランタイムであるCLRが管理しているものですが、.NET Frameworkの内部ではCLRが管理しないリソースも呼び出せるからです。

その他、ガベージコレクタが苦手とするパターンも多々存在するわけで・・・

続きを読む ".NET Framework のリソース開放基礎(1)"

12:29 午前 .NET | | コメント (0) | トラックバック (0)

2007年1月10日 (水)

ngenの引数はバージョン間で異なる

MSILなコードを高速化する手段の1つとしてネイティブコードジェネレータ(ngen)があります。

その名のとおり、MSILをx86等に予めコンパイルしてキャッシュしておくわけですが、何故か.NET Framework 1.1と2.0では引数が異なるのです。

続きを読む "ngenの引数はバージョン間で異なる"

12:26 午前 .NET | | コメント (0) | トラックバック (0)

2006年12月10日 (日)

Disposeの実装

Disposeの役目はなんでしょうか?マニュアルを見ても良く書かれてないように思います。ここでは、一般的な解釈を述べます。

.NET Framework 全体で考え方が統一されているかは別として、Disposeという言葉を聞くようになったのは、ガベージコレクタを使った言語です。

まずはDisposeの英語としての意味をおさらいしましょう。ここでは「処分する」が適切です。使わなくなったオブジェクトは「処分する」必要があります。じゃあ、ガベージコレクタは、何時処分すればいいのでしょうか?

そのヒントを与えるメソッドがDisposeです。

続きを読む "Disposeの実装"

10:26 午後 .NET | | コメント (0) | トラックバック (0)

2006年7月17日 (月)

フィールドとプロパティの差

私が他人のC++/CLIのソースを見ているときに気になる事があります。

何故この人は、同じクラス内からメンバ変数を参照するときにプロパティを経由するんだろう、と。

MSDNにも書かれているように、プロパティへのアクセスは一般的に高価になります。

続きを読む "フィールドとプロパティの差 "

01:41 午後 .NET | | コメント (0) | トラックバック (0)

2006年5月16日 (火)

ソースを変えずに高速化する(.NET Framework)

納期がギリギリでも高速化しなくてはならないことがあります。

そんな時に役に立つ、ソースを変更せずにコンパイル時や実行時の設定だけで高速化する方法を紹介します。

続きを読む "ソースを変えずに高速化する(.NET Framework)"

09:40 午後 .NET | | コメント (0) | トラックバック (0)

2005年12月13日 (火)

「Native-DLL」と「Managed-DLL」の探索方法は違う

Windowsにおいて、アセンブリはDLLで実装されています。

マネージドアプリ(EXE)からアセンブリ(DLL)を読み込む場合、一般的なWin32アプリケーションがEXEファイルからDLLを探索する手順とは異なるルールを採用しています。

続きを読む "「Native-DLL」と「Managed-DLL」の探索方法は違う"

09:22 午後 .NET | | コメント (0) | トラックバック (0)

2005年11月23日 (水)

混在DLLにおける問題

「.NET Framework」と「Win32API」を混ぜて作成した、Win32形式のDLLを混在DLLと呼びます。

Visual C++ .NET 2003で作成できますが、単純にエントリポイント(DLLMain)を実装する事は禁止されています。何が起こるかというと循環参照による無限ループの可能性です。なお、この問題はVisual C++ 2005で若干改善されました。

続きを読む "混在DLLにおける問題"

05:02 午後 .NET | | コメント (2) | トラックバック (0)

2005年11月19日 (土)

Box化(Boxing)とは?

.NETのオブジェクトには、値型と参照型があり、値型はスタックに、参照型はヒープに存在します。

BOX化(Boxing)を行うと、値型を参照型に変換する事が出来ます。つまり、ヒープ(※1)にオブジェクトをコピーする事をBOX化といいます。反対にBOX化解除(unboxing)とは参照型を値型に変換する事です。

一般的な言語(C#やVB.NET)では、マネージドヒープの値を直接変更できないので、BOX化を考える(※2)事は高速なアプリを作成する第一歩と言えます。

※1 .NETが管理するヒープを特にマネージドヒープと呼びます。小さなオブジェクトを沢山作成する事に最適化されています。

※2 C#やVBは文脈をみて勝手にBOX化します。対してMC++は明示的にBOX化する必要があります。MC++以外でBOX化を意識することは難しいかもしれません。

12:46 午前 .NET | | コメント (0) | トラックバック (0)