2008-12-29 96 views
1

我有一個C++ Windows應用程序,可以通過使用應用程序公開的API編寫C++插件來進行擴展。還有一個將C++ API轉換爲Python的插件(例如,插件可以用Python編寫)。使用C#插件擴展C++應用程序

我想讓用戶在C++和Python中編寫插件。由於我對.NET世界不是很熟悉,我不確定如何實現C#插件系統。

你會推薦使用什麼樣的插件系統(主機是C++,C#插件)?爲了實現這個目標我需要學習什麼?

回答

3

使用COM對象和接口公開您的API,您將開放您的應用程序到許多開發環境,包括C#。

1

我已經在過去不同的方式做到了這一點。我發現C++/CLI是構建.Net和非託管C++之間橋樑的最佳選擇(儘管如其他海報所述,另一種選擇是COM)。

我已經在過去這樣做的方式包括:

  1. 生成C++/CLI使用反射我的C++ API API包裝代碼。當然,本機C++沒有反射系統,所以我們推出了自己的系統。然後,生成的C++/CLI代碼被編譯成C#插件會引用的程序集。
  2. 使用反射從我的C++ API生成動態程序集(即使用Reflection.Emit)。生成的程序集可以在腳本語言中使用,或者甚至可以在運行時針對它編譯C#代碼。程序集甚至可以寫入磁盤以靜態使用。這裏的缺點是你可能不能發出比編譯器更好的IL,所以除非你需要動態生成,否則不要走這條路。
  3. 親手寫的C++/CLI API包裝器。如果API不是很大,手工編寫一個包裝就足夠簡單了。

最後,您將擁有一個用於編譯C#插件的程序集。現在您需要在運行時加載插件程序集。爲此,您必須託管CLR。主持CLR並不困難,雖然我只做了一次,那是幾年前 - 也許時代已經發生了變化。如果您不熟悉託管CLR,那麼儘可能將您的應用程序代碼粘貼到DLL中,然後編寫一個小型C++/CLI應用程序來調出非託管UI。現在,CLR由小型C++/CLI應用程序託管。