當你說「一般化解決方案」......你的意思是一個工具或過程,自動化這一點?
我相信這是可能的。以下是我如何做到這一點:
我假設你已經開始使用FireBreath並對其有所瞭解。我在談論無數的問題,並將其融入FireBreath解決方案中;這將需要幾天!所以這只是建築建議。我很抱歉忽略了這麼多細節。
我會寫一個工具,動態加載你的.NET程序集或程序集,並使用反射來遍歷'複雜的層次結構類結構'。這個工具將產生兩件事情:.NET庫的C++/CLI包裝器,以及一組從C++/CLI包裝器綁定到JavaScript的本地C++ FireBreath類。
C++/CLI包裝器(請參閱enter link description here)使您的.NET庫可以從FireBreath的本機C++中調用。 其實,這裏是a tool on CodePlex,聲稱能產生這樣一個包裝。
Javascript適配器是一組.cpp模塊(可能適用於您的每個庫/ C++/CLI類)。其中每一個都是從FB :: JSAPIAuto派生的C++類,它允許將這些類實例化爲Javascript對象。在這些類的每個類的構造函數中,自動化工具插入代碼以創建對象的JavaScript API。看起來像這樣的代碼:
registerMethod("Start", make_method(this, &thisClass::Start));
registerMethod("Abort", make_method(this, &thisClass::Abort));
registerProperty("Size", make_property(this, &thisClass::get_Size,&thisClass::set_Size));
自動化工具要綜合類的這些方法,如thisClass ::啓動和thisClass :: set_Size。它們的參數和返回類型是FireBreath支持的Javascript兼容類型 - 比如int和double和bool,還有std :: string,FB :: VariantMap和FB :: VariantList。在每種這樣的方法的主體中,該工具生成代碼來調用相應的C++/CLI包裝API,在參數和返回之間進行任何必要的轉換。
我想每個FB :: JSAPIAuto派生類都繼承自,作爲成員,或者持有指向它所表示的C++/CLI類/對象的指針。
作爲一個FireBreath項目,您的.NET庫最終由一個GUID表示 - 這就是Javascript通過從該GUID創建一個根對象的方式進入您的庫的方式。然後它調用方法或讀取該對象的屬性來獲取其他對象,等等來訪問整個庫API。
我想在Javascript和C#之間會有一些問題映射。您必須研究FireBreath支持的Javascript參數和返回類型,並相應地限制您的C#API。可能的關鍵是弄清楚Javascript對象和數組是如何通過C++/CLI層來表示的。
感謝您的回覆。請告訴我線條的意義我會寫一個動態加載.NET程序集或程序集的工具,並使用反射來遍歷「複雜的層次結構類結構」。這個工具會產生兩件事情:.NET庫的C++/CLI包裝器,以及一組從C++/CLI包裝器綁定到Javascript的本地C++ FireBreath類? – user2372247 2013-05-21 06:46:23
如果可能,請你分享一下你的代碼嗎?這樣我就可以在實現我的代碼時得到一個想法。 – user2372247 2013-05-27 10:07:29
你能幫我解釋一下如何在Firebreath的JavaScript頁面上註冊我的C#DLL並讓我知道。 – user2372247 2013-05-28 13:05:31