Chapter.16

はまり道(2)


1.クラスライブラリ化

前回までのサンプルは、Visual Studio .NET 2003の統合開発環境では、そのままコンパイル出来ませんでした。 これには長いこと気がついてませんでした。統合開発環境でコンパイル出来ない理由は、ソースファイルのそれぞれが名前空間を定義していることです。
統合開発環境は、ソース単位にコンパイルしているようですが、/addmoduleオプションによる結合を行っていないようです。 また、コマンドを一回発行するだけのコンパイル(サンプルで nmake static としてコンパイルするモノ)によるコンパイルも行っていないようです。
今回は、これを修正するために大幅に手を入れました。大きくはインターフェースとWin32API定義をクラスライブラリ化しました。 その他の修正点は、readme.txtを読んでください。

VB.NETサンプルソース:chap16.vb.lzh(37KB 2005/1/19)


2.C#化

サンプルコードのC#化要望が出ていたので、C#化してみました。
C#化した時に最も大きな違いが出たのは、outパラメータの存在です。 VB.NETでは、<Out()> ByRef と記述しなければならなかったところを out とだけ記述できるようになります。これによってインターフェース定義が、かなり自然になったと思います。
しかし、System.Guid等の構造体を入力パラメータに使用する際には、refパラメータ(VB.NETではByRef)System.Runtime.InteropServices.InAttribute属性を付与して記述する必要があることは変わっていません。
他には、任意の位置で改行できるため、行継続文字が不要となり、かなり見やすくなっています。

C#サンプルソース:chap16.cs.lzh(37KB 2005/1/19)

C#化するにあたり一番はまったのは、Main関数にSystem.STAThreadAttribute属性を付与しなければならないところです。 この属性が無ければ、OLEIDL.IDL中にlocal属性で定義されたインターフェースを使用するところで、System.InvalidCastException例外が発生するか、ハングアップします。稀に動作したりするので原因に気づくのに時間が掛かりました。
VB.NETとは異なりインターフェースの実装に、Implementsキーワードを付与しなくてもいい所が、ちょっと新鮮でした。個人的には、こういったキーワードはコーディングミス防止になるので、必須として欲しいものです。


3.まとめ

今後の方針として、C#のサンプルソースも提供していくことにします。VB.NETのサンプルは今まで通り提供していきます。解説は特に必要が無ければ、VB.NETのものを中心に行います。

今回のサンプルで一番の大きなポイントは、VB.NETでは、スレッドのアパートメントはデフォルトでSTAに設定されているようですが、C#では設定されていないことです。なお、アパートメントが設定されていない場合には、.NET FrameworkはMTAで動作すると記述があります。OLEの世界はSTAが基本です。ドラッグ&ドロップを使用する場合、C#でもSTAを使用しなければならない旨がドキュメントに記述されていますが、これはドラッグ&ドロップにOLEが使用されていることに起因しています。(と言うことを知りつつ今回の問題に気づくまでに時間が掛かってしまった・・・。)


前へ 次へ
OLE on .NET Frameworkへ
総合トップへ