SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

連載記事

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CodeZine BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。

書籍に関する記事を見る

'); googletag.cmd.push(function() { googletag.pubads().addEventListener('slotRenderEnded', function(e) { var ad_id = e.slot.getSlotElementId(); if (ad_id == 'div-gpt-ad-1659428980688-0') { var ad = $('#'+ad_id).find('iframe'); if ($(ad).width() == 728) { var ww = $(window).width(); ww = ww*0.90; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/728+","+ww/728+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/728+","+ww/728+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/728+","+ww/728+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/728+","+ww/728+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(90*ww/728)+"px;width:"+728+"px;}", 0 ); } else { if ($(window).width() < 340) { var ww = $(window).width(); ww = ww*0.875; var style = document.createElement("style"); document.head.appendChild( style ); var sheet = style.sheet; sheet.insertRule( "#div-gpt-ad-1659428980688-0 iframe {-moz-transform: scale("+ww/320+","+ww/320+");-moz-transform-origin: 0 0;-webkit-transform: scale("+ww/320+","+ww/320+");-webkit-transform-origin: 0 0;-o-transform: scale("+ww/320+","+ww/320+");-o-transform-origin: 0 0;-ms-transform: scale("+ww/320+","+ww/320+");-ms-transform-origin: 0 0;}", 0 ); sheet.insertRule( "#div-gpt-ad-1659428980688-0 div{ height:"+(180*ww/320)+"px;width:"+320+"px;}", 0 ); } } } }); }); } else { document.write('
'); document.write('
'); }
特集記事

C++/CLIで、機能拡張を簡単に実現するフレームワーク「MEF」を試してみた

re-buildなしに機能拡張!

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード サンプルファイル (29.4 KB)

 今回のお題は「MEF:Managed Extensibility Framework」。.NET Framework 4(Visual Studio 2010)で追加された、アプリケーションに拡張性を持たせることを目的としたフレームワークです。「re-buildなしにアプリケーションの機能拡張ができないか?」との相談を受け、MEFを試してみることにしました。

  • X ポスト
  • このエントリーをはてなブックマークに追加

 MEFは.NETライブラリですから、ピュアなC++では使えないけど「ほぼC++」なC++/CLIなら何とかなるんじゃないかと。MSDNで見つけたドキュメントを手掛かりに MEF:はじめの一歩をC++/CLIで踏み出しました。

DLL、COM、そしてMEF

 re-buildなしに機能拡張する手段はずっと以前からあります、WindowsではDLLがおなじみですね。DLLの中には関数名を埋め込むことができ、LoadLibrary()でDLLを読み込んだ後GetProcAddress()に関数名を与えれば、当該関数のアドレスが手に入り/呼び出すことができます。ただし手に入るのは関数のアドレスだけで、引数や戻り値に関する情報はもらえないので決め打ちにするしかありませんし、関数/変数をひとまとめにしたオブジェクト(クラス)を定義して呼び出すこともできません。そこでオブジェクトを定義し呼び出せるCOMの登場となるわけです。が、COMってシロモノは作る側も使う側もかなりややこしく、決して"お手軽"とは言い難い。

 MEFによる機能拡張では、拡張したい機能をinterfaceで定義します。機能を提供する側はそのinterfaceを実装したクラスを作ってExport(外に出す/公開する)し、対して機能を利用する側はinterfaceの受け皿を用意して、そこにImport(取り込む)します。MEFは提供(Export)側と利用(Import)側との仲介を行い、両者を結びつけてくれます。Export/Importはクラスや変数にアトリビュート:[Export(~)]/[Import(~)]を付記するだけなので、COMに比べて圧倒的に簡単です。

 能書きはこれくらいにして、サンプルをお見せしましょう。

二項電卓:Windows Formアプリケーションの作り方

 サンプルに用意したのは、こんな外観の電卓アプリケーション。

 int値を2つ入力し、演算子を選んで「=」ボタンを押すと答えが表示される、あまりのショボさに電卓と呼ぶのも恥ずかしい二項電卓をWindows Formsで作りました。ComboBoxに列挙される演算子をMEFで追加しようという魂胆です。

 Visual Studio 2012以降、C++/CLIによるCLRフォームアプリケーションのひな型がプロジェクトテンプレートから消えてしまいました。けども作れなくなったわけではありません。ちょっと寄り道になりますが、フォームアプリケーションの作り方を紹介しておきます。

 まず、プロジェクトテンプレートでは「空のCLRプロジェクト」を選択します。プロジェクト名は"SimpleCalculator"としましょう。

 つぎにメニュー:プロジェクト/新しい項目の追加...でWindowsフォームを追加します。フォーム名は"CalculatorForm"で。

 さらにメニュー:プロジェクト/新しい項目の追加...でC++ファイル(.cpp)、名前を"SimpleCalculator.cpp"としてコードを追加します。これがアプリケーションの入り口であるmain()です。

SimpleCalculator.cpp
#include "CalculatorForm.h"
using namespace System;

[STAThread]
int main(array<String^>^ args) {
  using namespace System::Windows::Forms;
  Application::EnableVisualStyles();
  Application::SetCompatibleTextRenderingDefault(false);
  Application::Run(gcnew SimpleCalculator::CalculatorForm());
  return 0;
}

 残るはプロジェクト・プロパティの設定。構成プロパティ/リンカー/システム/サブシステムをWindows(/SUBSYSTEM:WINDOWS)に、構成プロパティ/リンカー/詳細設定/エントリポイントをmainとします。

 ここでビルド/実行し、空っぽのCalculatorFormが現れたら出来上がり。2つのTextBoxとComboBox、Buttonそして大きなLabelを貼り付け、Button-Clickハンドラを用意して電卓フォームの完成です。

 最後にもう一つ、MEFを提供するアセンブリ:System.ComponentModel.Compositionへの参照を追加しておきます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
interfaceの定義とその実装

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

επιστημη(エピステーメー)

C++に首まで浸かったプログラマ。Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"りわんくま同盟でたまにセッションスピーカやったり中国茶淹れてにわか茶...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7738 2014/06/05 14:00
" ); }

おすすめ

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    オープンソース監視システム「Prometheus 3.0」が公開
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    Linuxディストリビューション「Nobara 41」が公開
  5. 5
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開 NEW
  1. 6
    8割超が目標を達成。約7割が収入増を実感、「プログラミングスクール受講による成果と実績」調査をTAG STUDIOが実施 NEW
  2. 7
    ミッチェル・ハシモト氏、高速で機能豊富なターミナルエミュレーター「Ghostty 1.0」リリース
  3. 8
    ガートナージャパン、企業が2025年に押さえておくべきセキュリティとプライバシに関する重要論点を発表 NEW
  4. 9
    日本経済新聞社の最新研究事例に学ぶ、マルチモーダルAI活用の勘所
  5. 10
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット NEW

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    オープンソース監視システム「Prometheus 3.0」が公開
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    Linuxディストリビューション「Nobara 41」が公開
  5. 5
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開 NEW
  6. 6
    8割超が目標を達成。約7割が収入増を実感、「プログラミングスクール受講による成果と実績」調査をTAG STUDIOが実施 NEW
  7. 7
    ミッチェル・ハシモト氏、高速で機能豊富なターミナルエミュレーター「Ghostty 1.0」リリース
  8. 8
    ガートナージャパン、企業が2025年に押さえておくべきセキュリティとプライバシに関する重要論点を発表 NEW
  9. 9
    日本経済新聞社の最新研究事例に学ぶ、マルチモーダルAI活用の勘所
  10. 10
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット NEW
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  4. 4
    「CUDA」 ~マンガでプログラミング用語解説
  5. 5
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  6. 6
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  7. 7
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  8. 8
    Google、社内AIエージェント「Google Agentspace」発表
  9. 9
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

メールバックナンバー

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    オープンソース監視システム「Prometheus 3.0」が公開
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    Linuxディストリビューション「Nobara 41」が公開
  5. 5
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開 NEW
  1. 6
    8割超が目標を達成。約7割が収入増を実感、「プログラミングスクール受講による成果と実績」調査をTAG STUDIOが実施 NEW
  2. 7
    ミッチェル・ハシモト氏、高速で機能豊富なターミナルエミュレーター「Ghostty 1.0」リリース
  3. 8
    ガートナージャパン、企業が2025年に押さえておくべきセキュリティとプライバシに関する重要論点を発表 NEW
  4. 9
    日本経済新聞社の最新研究事例に学ぶ、マルチモーダルAI活用の勘所
  5. 10
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット NEW

アクセスランキング

  1. 1
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  2. 2
    オープンソース監視システム「Prometheus 3.0」が公開
  3. 3
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  4. 4
    Linuxディストリビューション「Nobara 41」が公開
  5. 5
    Renewer、Tips集「生成AI × 勉強法ガイドブック 2025」を公開 NEW
  6. 6
    8割超が目標を達成。約7割が収入増を実感、「プログラミングスクール受講による成果と実績」調査をTAG STUDIOが実施 NEW
  7. 7
    ミッチェル・ハシモト氏、高速で機能豊富なターミナルエミュレーター「Ghostty 1.0」リリース
  8. 8
    ガートナージャパン、企業が2025年に押さえておくべきセキュリティとプライバシに関する重要論点を発表 NEW
  9. 9
    日本経済新聞社の最新研究事例に学ぶ、マルチモーダルAI活用の勘所
  10. 10
    より良いプロダクトを作り続けるために ――ソフトウェアエンジニアのための3つのキャリア構築マインドセット NEW
  1. 1
    いいエンジニアになるための2つのポイント ──元Google技術者・石原氏が説く「シリコンバレー流ソフトウェア開発術」
  2. 2
    アジャイル開発の推進において、必ずしも"すごい人"は必要ない──現場のエンジニアがDevOps推進で実現する組織改革
  3. 3
    デスクトップアプリを開発しよう! 「Rust」と「Tauri 2.0」の基本情報と環境整備の仕方を解説
  4. 4
    「CUDA」 ~マンガでプログラミング用語解説
  5. 5
    デスクトップアプリ開発に必要な「Rust」の文法を理解しよう
  6. 6
    1/10まで全文無料公開、人気の入門書シリーズ『いきなりプログラミング Androidアプリ開発』
  7. 7
    "けしからん"精神が切り拓く未来──IPA登氏が語る、技術大国・日本が目指す復活戦略
  8. 8
    Google、社内AIエージェント「Google Agentspace」発表
  9. 9
    ガントチャートをWebアプリに組み込める「ガントシート」でプロジェクト管理機能を作成してみよう
  10. 10
    JavaScriptのWebフレームワーク、「Astro 5.1」リリース