特集Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!επιστημη(えぴすてーめー)2007/01/31 |
|
|
●Win32スタティック・ライブラリ(C関数)の準備
以下のコードは“Hello, world”を出力するC言語で書かれたスタティック・ライブラリ(.libファイル)のソース・コードです。
|
|
Win32スタティック・ライブラリのCヘッダ・ファイル(hello.h) |
|
|
Win32スタティック・ライブラリのCソース・ファイル(hello.c) | |
“Hello, world”を出力する。 |
まずはVisual Studio 2005(以下VS 2005)を立ち上げ、[新しいプロジェクト]ダイアログで「Visual C++」−「Win32」の「Win32 プロジェクト」というテンプレートから「hellolib」という名前でプロジェクトを新規作成します。この際、[Win32 アプリケーション ウィザード]というダイアログが表示されるので[アプリケーションの種類]として「スタティック ライブラリ」を選択し、[追加のオプション]から「プリコンパイル済みヘッダー」のチェックを外して作成します。
そして、これらのファイルをプロジェクトに追加し、ビルドによってスタティック・ライブラリ「hello.lib」を作ります。これはネイティブ・ライブラリなのでC#から直接呼ぶことはできません。
●.NETダイナミック・ライブラリ(薄いラッパー)の作成
そこで、C++/CLIを使ってこのhello.libをマネージ・コードから呼べるように、薄いラッパーとなるCLR(=C++/CLI)のダイナミック・ライブラリ(.dllファイル。以下、.NETダイナミック・ライブラリ)作ります。
先ほど作成したソリューションに対してCLRのクラス・ライブラリのプロジェクトを追加します。次の画面のように[新しいプロジェクトの追加]ダイアログで「Visual C++」−「CLR」の「空の CLR プロジェクト」テンプレートを選択して「hellolib」という名前で新しいプロジェクトを作成します。
VS 2005でのクラス・ライブラリ・プロジェクトの新規作成 |
薄いラッパーとなる.NETダイナミック・ライブラリを作成しているところ。この[新しいプロジェクトの追加]ダイアログを表示するには、IDEのメニュー・バーから[ファイル]−[追加]−[新しいプロジェクト]を選択すればよい。 |
作成したら「hellolib」プロジェクトのプロパティで構成を「ダイナミック ライブラリ (.dll)」に変更しておきます。
そして、そのプロジェクトに以下のソース・ファイルを追加します。
|
|
.NETダイナミック・ライブラリのC++/CLIヘッダ・ファイル(hellolib.h) |
|
|
.NETダイナミック・ライブラリのC++/CLIソース・ファイル(hellolib.cpp) | |
Win32スタティック・ライブラリの薄いラッパーとなる。 |
さらに、スタティック・ライブラリ「hello.lib」とソース・ファイルに記述しているインクルード・ファイル「hello.h」への参照を設定する必要があります。前者を設定するには、「hellolib」プロジェクトの[依存関係の設定]で「hello」を[依存先]として指定するだけです。後者は、「hellolib」プロジェクトのプロパティで「hello.h」ファイルのあるディレクトリ(本稿の例では「..\hello」)をC/C++の[追加のインクルード ディレクトリ]として指定します。
最後にビルドを行い、.NETダイナミック・ライブラリ「hellolib.dll」を生成します。
このライブラリはC++/CLIで作られたものですから、C#やVBから呼び出すことができるはずです。
●.NETアプリケーションからのライブラリ(C関数)の利用
実際に呼び出してみましょう。
「hellouser」という名前でC#の「コンソール アプリケーション」のプロジェクトをソリューションに新たに追加します。作成されたプロジェクトに対し「hellolib」プロジェクトへの参照設定を追加し、Program.csファイルのMainメソッドに、次の太字部分のコードを書き加えます。
|
|
Win32ネイティブ・コードの関数を扱うC#のサンプル・コード(hellouser.cs) | |
C++によって作成されたWin32ネイティブ・コードの既存資産に、.NET言語のC#やVBからアクセスする。薄いラッパーであるHelloLibクラスのExecuteメソッドを経由してhello.libに実装されているhello関数にアクセスしている。 |
このC#コードをコンパイルし実行すると、C++/CLIによるHelloLibを介してネイティブ・コードのhello関数を呼び出せます。C++/CLIがネイティブ・コードであるC/C++資産とマネージ・コードとの仲介を受け持ってくれるわけです。
以上のサンプル・プログラムはここ(hello.zip)からダウンロードできます。
■ネイティブ・オブジェクトをマネージ・コードでくるむ
さて、それでは単純なC関数ではなく、ネイティブなC++クラスおよびそのメソッド群をマネージ・コードから呼ぶにはどうすればいいのでしょうか。
INDEX | ||
[特集] | ||
Vista時代のVisual C++の流儀(前編) | ||
Vista到来。既存C/C++資産の.NET化を始めよう! | ||
1.Vista時代にC/C++はもはやお払い箱なのか? | ||
2.C/C++資産をどこまで生かせる? | ||
3.ネイティブ・オブジェクトをマネージ・コードでくるむ | ||
4.文字コード変換 | ||
Vista時代のVisual C++の流儀(中編) | ||
MFCから.NETへの実践的移行計画 | ||
1.C++/CLIによるWindowsフォーム・アプリケーション | ||
2.言語をまたいだDocument/Viewアーキテクチャ | ||
3..NET移行前のMFCサンプル・アプリケーション | ||
4.MFCのDocument/Viewアーキテクチャの.NET化 | ||
5.MFCで書かれたDocumentを.NET化する2つの方法 | ||
Vista時代のVisual C++の流儀(後編) | ||
STL/CLRによるDocument/Viewアーキテクチャ | ||
1.STL/CLRとは | ||
2.STL/CLRの特徴 | ||
3.Visual Studio 2005で試す | ||
4.おまけ:NUnitの活用 | ||
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|