特集

Vista時代のVisual C++の流儀(前編)

Vista到来。既存C/C++資産の.NET化を始めよう!

επιστημη(えぴすてーめー)
2007/01/31
Page1 Page2 Page3 Page4

●Win32スタティック・ライブラリ(C関数)の準備

 以下のコードは“Hello, world”を出力するC言語で書かれたスタティック・ライブラリ(.libファイル)のソース・コードです。

#ifndef HELLO_H__
#define HELLO_H__

#ifdef __cplusplus
extern "C" {
#endif

  void hello();

#ifdef __cplusplus
}
#endif

#endif
Win32スタティック・ライブラリのCヘッダ・ファイル(hello.h)
 
#include <stdio.h>
#include "hello.h"

void hello() {
  printf("Hello, world\n");
}
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)」に変更しておきます。

 そして、そのプロジェクトに以下のソース・ファイルを追加します。

#ifndef HELLOLIB_H__
#define HELLOLIB_H__

public ref class HelloLib {
public:
  static void Execute();
};

#endif
.NETダイナミック・ライブラリのC++/CLIヘッダ・ファイル(hellolib.h)
 
#include "hellolib.h"
#include "hello.h"

void HelloLib::Execute() {
  hello();
}
.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メソッドに、次の太字部分のコードを書き加えます。

……省略……
class Program {
  static void Main(string[] args) {
    HelloLib.Execute();
  }
}
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の活用


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間