2009-06-25 4 views
9

私の選択した言語を使用してグラフィカルユーザーインターフェイスアプリケーションを作成する必要があります。アプリケーションはWindows XP上で動作します。それは、複雑なウィンドウフォームアプリケーションのいくつかの並べ替えになります。 ほとんどの提案によれば、C#は使用するのに最適です。 GUIの左側にあるツリー構造は、バイナリファイルとなる構成ファイルから読み込んだ後に入力されます。 (しかし、最初は単純なASCIIファイルを使ってコードをテストすることができます)。アプリケーションは、このGUIを通じてユーザーからの入力を受け入れ、同じ構成ファイルにバックを書き込んで、ツリー構造やラベル、またはフォーム上のその他の関連フィールドの変更を反映します。C#でのプラグインベースのアプリケーション

各タブには3つのタブと3つの対応する設定ファイルがあります。 私は今、アプリケーションを設計するための助けが必要です。私は、ホストアプリケーション(メインアプリケーション)を作成し、3つのタブコントロールをプラグインとして使用する予定です。これは実行可能ですか?もしそうなら、私にこれを案内してください。私はC#で3つのプラグインを作るにはどうすればいいのですか?メインアプリケーションがどのプラグインをロードするのか、そしていつロードするのかを知るために、どのようにインターフェイスを書くのですか?プロジェクトフォルダの下に別の「Plugin」フォルダがありますか?私はあなたのポイントを得ることを願っていますが、これはあなたが始めるにはあまり情報がありません。

また、いくつかの.cppファイルが既にプロジェクトに存在します。これらのファイルといくつかの.hファイルには、重要な定義と定数が含まれています。これらは私のC#アプリケーションと統合する必要があります。私はそれを行う方法を知りませんが、.dllで.cppコードをコンパイルし、コンパイルした.dllをC#アプリケーションに公開することによって可能であると確信しています。最上位レベルのデザインに関する詳細情報が必要な場合はお知らせください。

おかげで、私が今まで使用している最も簡単なプラグインコンセプトの Viren

+0

「グラフィカルユーザーインターフェイスアプリケーションを作成する必要があります」 "いいえ"と言う勇気がありますか? – ima

+0

私はあなたを得ませんでしたか? – zack

答えて

12

手動でプラグインインタフェースを実装するには、次のようなメソッドが必要です。いくつかのTODOを残しました。ここでは、エラー処理を強化したり、実装を少しだけ具体化したりしたいと思っています。

public List<T> LoadPlugin<T>(string directory) 
    { 
     Type interfaceType = typeof(T); 
     List<T> implementations = new List<T>(); 

     //TODO: perform checks to ensure type is valid 

     foreach (var file in System.IO.Directory.GetFiles(directory)) 
     { 
      //TODO: add proper file handling here and limit files to check 
      //try/catch added in place of ensure files are not .dll 
      try 
      { 
       foreach (var type in System.Reflection.Assembly.LoadFile(file).GetTypes()) 
       { 
        if (interfaceType.IsAssignableFrom(type) && interfaceType != type) 
        { 
         //found class that implements interface 
         //TODO: perform additional checks to ensure any 
         //requirements not specified in interface 
         //ex: ensure type is a class, check for default constructor, etc 
         T instance = (T)Activator.CreateInstance(type); 
         implementations.Add(instance); 
        } 
       } 
      } 
      catch { } 
     } 

     return implementations; 
    } 

コールする例:C++あなたの質問の一部については

List<IPlugin> plugins = LoadPlugin<IPlugin>(path); 

。正しい選択はあなたの特定の状況によって異なりますが、これにアプローチする方法はいくつかあります。 clr準拠の.dllをC++で作成することができます。これは、C#プロジェクトが参照できる他の.dllと同様に呼び出すことができます。さらに、P/Invokeを使用してネイティブの.dllファイルを呼び出すこともできます。

+0

本当に助けてくれてありがとうございました。 – zack

+0

あなたが探していなかったと思う記事に出くわしいことは、機能、素晴らしい出発点! – RobertPitt

8

一つは、確かに、.NET 4(私の知る限り)の一部となりますManaged Extensibility Frameworkました。残念ながら、まだ完成していないし、最終版とは異なるかもしれないプレビューのみが利用可能である。つまり、私たちはユニプロジェクトのMEFプレビュー3を使用していましたが、問題なく動作し、確かにプラグイン全体をもっと簡単にしました。

+0

MEFを使いましょう。素晴らしいです。 –

1

Castleをご覧ください。

+0

ありがとう..キャスルは幻想的だと思っていました。私はそれに気付いていませんでした.. – zack

3

ルック: http://msdn.microsoft.com/en-us/library/system.addin.aspx

そうでなければあなた自身がすべてを行うことができます。この名前空間が利用可能になる前に、私は共通のインターフェース "IPlugin"を使用して、すべてのプラグイン/アドインを使用する必要がありました。私はその後、フォルダー内の* .dllをすべて検査したローダーを持っていて、インターフェースをチェックするためにリフレクションを使用しました。プラグイン/アドインインターフェイスを実装したクラスのインスタンスを作成することができます

cppファイルはおそらくc#に変換する必要があります。

関連する問題