Win32 から.NETアセンブリを呼び出す (unmanaged 混在ライブラリ) - Delphi 2005

前回までは、COMを使った方法で.NETのクラスライブラリをWin32アプリケーションから呼び出してみました。今回はもっと簡単にDelphiらしい方法で呼び出してみたいと思います。  まず、「新規作成」の「その他」で、ダイアログボックスを開きます。今回は、Delphi for .NET プロジェクトの「ライブラリ」を選びます。

 次にユニットをひとつ追加します。新規ファイルの「ユニット」を選んでユニットを追加してください。

 追加したユニットにコードを書きます。今回は、関数をひとつ書いてみます。関数の内容は、.NET frameworkの System.Text.RegularExpressions を用いて、文字列の検索をする関数です。入力とパターンを受け取りマッチしたインデックスを戻り値として返す関数です。

余談ですが、.NETアセンブリでは呼び出し規約がilcodeとなるようです、下図でコメントアウトされている行のように明示的にilcodeをつけてもコンパイルが通ります。逆にstdcallなどとは指定できないようです。

 次に、ライブラリのコードを修正します。ライブラリのプロジェクトソースの、一番下の部分に、{$UNSAFECODE ON} を追加し、さらに、exports 節を追加します。

 以上でライブラリは完成しました。ビルドしておきます。次に、呼び出し側アプリケーションを作成します。プロジェクトマネージャーから「プロジェクトの追加」をし、「VCLフォームアプリケーション」を追加します。

追加できましたら、このプロジェクトをライブラリと同じディレクトリに保存します。同じ名前で上書きしないよう注意して保存してください。次にフォームの設計をします。Editを2つ、ボタンをひとつ、Labelをひとつ配置します。

 まず、Formの宣言部の下に、DLLからの関数インポートのコードを書きます。呼び出し規約はstdcallにします。external の後には、ライブラリのDLL名を指定します。そして、ButtonのOnClickにコードを書きます。Edit1,Edit2の内容を用いてDLLの関数を呼び出す内容のコードを書きました。

以上で完成です。アプリケーションを実行します。Edit1に適当な文字をいれ、Edit2に検索パターンを入れて、Buttonを押します。下図の例では、入力を"Borland Delphi 2005" と入力し、パターンを"De2"とした結果です、De に一致するパターンが検索できて、"8"が表示されます。

この方法は、簡単に.NETアセンブリを呼び出すことができます。手軽で簡単に実装できる反面、DLLのインポートエクスポート部分は、従来のWin32のDLLインポートと同じため、クラスなどを簡単に使うことはできません。また、DLL側は完全なマネージコードではなく、アンマネージコードが混ざってしまいます。このため、DLLのサイズが結構大きくなってしまいます。下の図を見ればわかるとおり、今回のたった数行のライブラリのDLLのサイズは1メガになってしまいました。最近は、ディスク容量も数百ギガとなっているので、サイズなどはあまり気にしなくはなってきていますが、サイズが大きくなることは、一応心の隅には止めておいたほうが良いかもしれません。



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-02-03
作成日: 2005-01-01
iPentec all rights reserverd.