2009-06-25 62 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 2009-06-25 13:40:07

+0

我沒有找到你嗎? – zack 2009-06-26 14:48:24

回答

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; 
    } 

實例調用:

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

至於你的問題的C++的一部分。有幾種不同的方法可以解決這個問題,但正確的選擇取決於您的具體情況。您可以在C++中製作符合clr的.dll文件,您的c#項目可以像引用的任何其他.dll文件一樣引用和調用它。此外,您可以使用P/Invoke調用本機.dll。

8

一個我曾經使用過的最簡單的插件概念肯定是Managed Extensibility Framework這將是.NET 4(據我所知)的一部分。不幸的是,它尚未完成,只有預覽可用,這可能與最終版本不同。話雖如此,我們使用MEF Preview 3進行uni項目,並且沒有任何問題,它確實使整個插件變得更加簡單。

+0

絕對使用MEF它很棒。 – 2009-06-25 13:53:57

1

看一看Castle

+0

謝謝..卡斯爾似乎太棒了..我沒有意識到它.. – zack 2009-06-26 14:44:17

3

看那System.Addin命名空間: http://msdn.microsoft.com/en-us/library/system.addin.aspx

否則你可以自己做的一切。在此命名空間可用之前,我使用了每個插件/插件需要使用的通用接口「IPlugin」。然後我有一個加載程序,它檢查文件夾中的所有* .dll,然後使用反射來檢查界面。然後,我可以創建實現我的插件/插件接口的類的實例

cpp文件可能需要轉換爲c#,或者您可以創建一個dll來引用。