特集

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

STL/CLRによるDocument/Viewアーキテクチャ

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

 cliext名前空間に属するクラス/関数はVisual C++ディレクトリ内の「include/cliext」ディレクトリにあるヘッダ・ファイルで、Microsoft::VisualC::StlClr名前空間に属するものは「lib」ディレクトリにあるMicrosoft.VisualC.STLCLR.dllアセンブリで提供されています。

 そこでお試しに先立って“Orcas”のVisual C++ディレクトリから、「include/cliext」ディレクトリ以下の全ヘッダ・ファイルをディレクトリごと、そして「lib」ディレクトリにあるMicrosoft.VisualC.STLCLR.dllを適当なディレクトリにコピーしておきます。

 C++/CLIでCLRクラス・ライブラリのプロジェクト「STLCLRlib」を作り、そのプロジェクトのプロパティ・ページの[共通プロパティ]−[参照設定]でMicrosoft.VisualC.STLCLR.dllを参照設定します。

STLCLRlibプロジェクトのプロパティ・ページにおける「参照設定」
アセンブリの参照設定はプロジェクトのプロパティ・ページの[共通プロパティ]−[参照設定]から行う。プロパティ・ページはソリューション・エクスプローラで右クリックしてコンテキスト・メニューから[プロパティ]を選べば表示できる。

 さらにプロパティ・ページの[構成プロパティ]−[C/C++]−[全般]で「追加のインクルード ディレクトリ」にcliextヘッダ・ファイルのあるディレクトリを、また「#using 参照の解決」にMicrosoft.VisualC.STLCLR.dllを置いたディレクトリを設定します。

STLCLRlibプロジェクトのプロパティ・ページにおける「追加のインクルード ディレクトリ」と「#using参照の解決」の設定
左のツリーから[構成プロパティ]−[C/C++]−[全般]を選択して設定を行う。

 では簡単なC++/CLIアセンブリを書いてみましょう。

#include <cliext/vector>

using namespace System;
using namespace System::Collections::Generic;

namespace STLCLRlib {
  public ref class Utility {
  public :
    static IList<String^>^ make_ilist() {
      cliext::vector<String^>^ result =
        gcnew cliext::vector<String^>();
      result->push_back(L"first: initially exists.");
      result->push_back(L"second: initially exists.");
      return result;
    }
  };
}
STL/CLRを活用した簡単なC++/CLIのソース・コード(STLCLRlib.cpp)
STL/CLRのvector<T>テンプレート(cliext名前空間)のコンテナに「first: initially exists.」「second: initially exists.」という2つの文字列を追加している。

 このアセンブリの利用者側(コンソール・アプリケーション)は、例えば以下のようになります。

using System;
using System.Collections.Generic;

namespace STLCLRuse {

  class STLCLRuse {
    static void Main(string[] args) {

      // vector<string>テンプレートのオブジェクトを
      // IList<string>インターフェイスのオブジェクトで受け取る
      IList<string> ic = STLCLRlib.Utility.make_ilist();

      // IList<string>オブジェクトのメソッド
      ic.Add("also added");

      // ICollection<string>オブジェクトのメソッド
      int entries = ic.Count;
      Console.WriteLine("{0} items in this vector.", entries);

      // IEnumerableインターフェイスを利用してforeachで列挙
      foreach (string item in ic) {
        Console.WriteLine(item);
      }
    }
  }
}
STL/CLRを使ったアセンブリを利用するためのC#のソース・コード(STLCLRusr.cs)
C++/CLIで実装したSTL/CLRのvector<string>オブジェクトを.NETのIList<String>オブジェクトとして受け取り、そのIList<String>オブジェクトのAddメソッドで新たに「also added」という文字列を追加している。その後、コンテナ内のすべての要素をコンソール出力している。

 以上で完成したサンプル・プログラムを実行したのが次の画面です。

STL/CLRを活用したDocument/Viewアーキテクチャを持つサンプル・アプリケーションの実行

 このようにSTL/CLRの登場によって、C++/CLI+STL/CLRでDocument側を作成し、C#でView側を作成して、Document/Viewアーキテクチャのスムーズなコンビネーションを実現できるようになります。


 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 記事ランキング

本日 月間