特集

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

MFCから.NETへの実践的移行計画

επιστημη(えぴすてーめー)
2007/03/06

 事前の準備として、「dotNetStringStack」という名前で新規ソリューションを作成し、このソリューションに先ほど作成したMFCアプリケーションの「MFCStringStack」プロジェクトを追加します(詳しい作成手順は、「.NETでのDocument/Viewアーキテクチャの構築方法」の項で説明した積算機アプリケーションの手順を参考にしてください)。

 さらに、Documentとして「StringStackDocument」という名前のC++/CLIのクラス・ライブラリのプロジェクトを、Viewとして「StringStackView」という名前のC#のWindowsフォーム・アプリケーションのプロジェクトを追加します。StringStackViewプロジェクトでは、[参照設定]でStringStackDocumentプロジェクトを参照するように設定してください。最後に、StringStackViewプロジェクトを[スタートアップ プロジェクトに設定]します。

●Documentインターフェイスの作成

オブジェクト指向プログラミング超入門「最終回 オブジェクトをつなぐためのインターフェイス」
改訂版 C#入門「第4章 継承とインターフェイス」
改訂版 C#入門「第14章 インターフェイスの活用」

 まずはDocumentのインターフェイスを定義し、これだけでアセンブリ(StringStackInterface.dll)を作成しておきます。

 具体的には、dotNetStringStackソリューションに「StringStackInterface」という名前のC#のクラス・ライブラリのプロジェクトを新規に追加し、自動生成されたファイルを開き(本稿では「Class1.cs」を「StringStackInterface.cs」にリネームしています)、以下のコードに書き換えます。

// StringStackInterface.cs
namespace dotNet {
  public interface StringStackInterface {
    void   Push(string element);
    string Pop();
    void   Clear();
    bool   Empty();
    int    Size();
    string At(int index);

    void AddObserver(System.EventHandler handler);
    void RemoveObserver(System.EventHandler handler);
  }
}
C#で記述したDocumentのインターフェイスのソース・コード(StringStackInterface.cs)

 Viewはこのインターフェイスを経由してDocumentを操作しますので、(Viewを実装するC#の)StringStackViewプロジェクトでStringStackInterfaceプロジェクトを参照設定しましょう。

 さらにDocumentはこのインターフェイスをインプリメントすることになるので、(Documentを実装するC++/CLIの)StringStackDocumentプロジェクトでもStringStackInterfaceプロジェクトを参照設定しておきましょう(※VC++での参照設定は、ソリューション・エクスプローラでプロジェクトを右クリックして、表示されるコンテキスト・メニューから[参照]をクリックしてプロパティ・ページを開き、そのプロパティ・ページの[新しい参照の追加]ボタンを押すと表示されるダイアログの[プロジェクト]タブから設定できます)。

●Viewの構築

 Viewのデザインは元のMFCアプリケーションと同じにします。本稿では自動生成された「Form1.cs」を「StringStackView.cs」にリネームし、Windowsフォームのクラス名を「StringStackView」としています。

C#によるView(Windowsフォーム)のデザイン(StringStackView.cs)

 あとは各ボタンのClickイベント・ハンドラを実装し、DocumentからのUpdateAllViewsイベントを受理して左側のリストボックスを埋めるOnUpdateメソッドを追加します。

// StringStackView.cs
……省略……
namespace dotNet {
  public partial class StringStackView : Form {

    private StringStackInterface document_;

    // コンストラクタ。Documentをパラメータに受け取る
    public StringStackView(StringStackInterface doc) {
      document_ = doc;
      // OnUpdateメソッドを
      // UpdateAllViewsイベント・ハンドラとして設定
      document_.AddObserver(this.OnUpdate);
      InitializeComponent();
    }

    private void push__Click(object sender, EventArgs e) {
      document_.Push(string_.Text);
    }

    ……省略……

    // Documentからのイベントを受理
    private void OnUpdate(object sender, EventArgs e) {
      stack_.Items.Clear();
      for (int index = document_.Size() - 1; index >= 0; --index) {
        stack_.Items.Add(document_.At(index));
      }
    }
  }
}
ViewのClickイベント・ハンドラとOnUpdateメソッドの実装(StringStackView.cs)

 Windowsフォームを起動するMainメソッドでは、生成したDocument(=StringStackDocumentクラスのオブジェクト)をフォーム(=StringStackViewクラス)のコンストラクタに与えなくてはなりません。

using System;
using System.Windows.Forms;

namespace dotNet {
  static class StringStack {
    [STAThread]
    static void Main() {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new StringStackView(new StringStackDocument()));
    }
  }
}
フォームを起動するMainメソッドのソース・コード(Program.cs)

●Documentの構築

 さて、準備が整ったところでDocument側をC++/CLIで実装します。MFCで書かれた元コードのDocumentを.NET化するわけですが、これには大きく2つの方針が考えられます。「できるだけ.NET Frameworkを利用するか」もしくは「できるだけネイティブな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 記事ランキング

本日 月間