MEFは、マネージド拡張フレームワークの略で拡張性の高い、軽量なアプリケーションを作成するためのライブラリです。開発者は、アプリケーション間で拡張検索および拡張に使用するMEFを使用することができますが、設定する必要はありませんが、また、再利用することができます。拡張アプリケーションは、大規模なアプリケーションアーキテクトの問題は考慮しなければならないです。前のソリューションは、通常、設定ファイル、および達成するために、界面反射技術を使用しています。そして、MEFは、発見コンポーネントを介して暗黙的にする方法を提供します。(「インポート」と呼ばれる)宣言同時に依存関係を特定MEF成分(「エクスポート」と称する)は、その機能を提供します。MEFは、.NET Framework 4のの不可欠な部分である、.NET Frameworkの初期のバージョンでは、管理対象アドインの枠組み(MAF)を導入 、 拡張を隔離し、管理するためのアプリケーションを有効にするために設計されています。MEFよりも僅かに高いレベルにMAFの焦点は、それがロードおよびアンロードの単離およびアセンブリの拡大に焦点を当て、そしてMEFを見つけ、拡張性および移植性に焦点を当てています。両方のフレームワークをスムーズに相互運用することができ、単一のアプリケーションプログラムが、同時にこれらの2つのフレームを使用することができます。
本論文では、簡単なテストMEF、
最初の新しいコンソールプロジェクトを作成し、MEFの枠組みへの参照を追加し、両方のSystem.ComponentModel.Composition.dllし、次のコードを入力します。
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.ComponentModel.Compositionを。 使用してSystem.ComponentModel.Composition.Hostingを。 使用してSystem.Linqのを。 使用するSystem.Reflectionを。 使用してSystem.Textのを。 使用してSystem.Threading.Tasksを。 名前空間MEFDemo { クラスプログラム { // 导入对象使用 [インポート(" chinese_hello " )] パブリック者oPerson { セット。取得; } [インポート("TestProperty " )] パブリック 文字列 ConsoleTest { 得る ; セット;} [インポート(" ActionTest " )] パブリックアクション< ストリング > TestActionImport { セット、取得;} [インポート(" FuncTest " )] 公共のFunc < ストリング > TestFuncImport { セット。取得}; [インポート(" FuncTestvalueを" )] 公共のFunc <文字列、文字列 > TestFuncImport2 { セット。取得; } // 多参数 // 公共のFunc <文字列、文字列、文字列> TestFuncImport2 {セット。取得する; } 静的 ボイドメイン(文字列[]引数) { VARの oProgram = 新しいプログラム()。 oProgram.MyComposePart(); #ifの偽 // 测试一 VAR strRes = oProgram.oPerson.SayHello(" 李磊" ); Console.WriteLineを(strRes)。 #endifの #ifの真 /// /テスト二 oProgram.TestActionImport(" ジム"); // 戻り値の するvar A = oProgram.TestFuncImport(); // 値を返す のvar(B = oProgram.TestFuncImport2 " 引数を渡すことはできませんが"); // 値パラメータ渡し返すことができる // Console.WriteLineを(A)を、 Console.WriteLineを(B); #endifの Console.Read(); } // MEF体組成物とホスト 空隙MyComposePartを() { // Assembly.GetExecutingAssembly() :現在の方法どこアセンブリ //Assembly.GetCallingAssembly():アセンブリの現在の方法は、メソッド呼び出し のvarカタログ= 新しい新しいAssemblyCatalog(Assembly.GetExecutingAssembly()); VARのコンテナ= 新しい新しいCompositionContainer(カタログ); // ホストプログラムおよび組成物に成分(パート)を追加容器 container.ComposeParts(この); } } パブリック クラスTestPropertyImport { [エクスポート(" TestProperty " )] パブリック 文字列 TestMmport { GET { リターン " テストプロパティをインポートおよびエクスポートすることができます" ;}} [エクスポート(" ActionTest "、typeof演算(アクション< 文字列 > ))] 公共 ボイド TestAction(文字列名) { Console.WriteLineを(" こんにちは:" + 名)。 } [エクスポート(" FuncTest "、typeof演算(機能< ストリング > ))] パブリック 文字列 TestFunc() { リターン " こんにちは:" + " 1111" ; } [エクスポート(" FuncTestvalue " typeof演算(機能< 文字列、文字列 > ))] パブリック 文字列 TestFuncValue(列名) { リターン " こんにちは:" + 名; } } // 声明对象可以导出 [エクスポート(" chinese_hello "、typeof演算(人))] パブリック クラス中国:人 { 公共の 文字列sayHello(文字列名) { リターン " 你好:" + 名。 } } [エクスポート(" american_hello "、typeof演算(人))] パブリック クラス:アメリカ人 { パブリック 文字列のsayHello(列名) { リターン " こんにちは:" + 名。 } } パブリック インターフェイス人 { ストリングのsayHello(列名); } }