特集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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える 
 
  | 
 |






