2013-05-11 48 views
0

我需要建立在C#中類和調用從JavaScript類通過C++ CLI和Firebreath框架..創建複雜的分層級的結構和javacsript揭露它C#類

該流程應該是:

Javascript <-- C++(FireBreath)<-- C#

C#-->C++(Firebreath)-->Javascript

我必須爲這個問題創建廣義的解決方案。

那我該如何實現呢?如果您有任何解決方案,排序的信息,辦法則解決了這個問題,請讓我知道..

假設在C#中,其中包括像類我的類庫:

public class TestImage 
{ 
} 

public class DrawImage 
{ 
public void ShowImage(TestImage testImage) 
{ 
} 
} 

在這裏,我需要調用來自Firebreath Framewaork的JavaScript頁面的ShowImage(TestImage testImage)方法。 我已經創建了包裝器,但我沒有想法將類對象作爲參數暴露給Fireabreath框架的JavaScript頁面中的上述ShowImage()方法。

如果您對此有任何想法,請讓我知道。

回答

2

當你說「一般化解決方案」......你的意思是一個工具或過程,自動化這一點?

我相信這是可能的。以下是我如何做到這一點:

我假設你已經開始使用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層來表示的。

+0

感謝您的回覆。請告訴我線條的意義我會寫一個動態加載.NET程序集或程序集的工具,並使用反射來遍歷「複雜的層次結構類結構」。這個工具會產生兩件事情:.NET庫的C++/CLI包裝器,以及一組從C++/CLI包裝器綁定到Javascript的本地C++ FireBreath類? – user2372247 2013-05-21 06:46:23

+0

如果可能,請你分享一下你的代碼嗎?這樣我就可以在實現我的代碼時得到一個想法。 – user2372247 2013-05-27 10:07:29

+0

你能幫我解釋一下如何在Firebreath的JavaScript頁面上註冊我的C#DLL並讓我知道。 – user2372247 2013-05-28 13:05:31

0

我剛剛使用COM實現了這樣的效果。我將C#庫作爲COM對象公開,然後編寫了幾個封裝函數,它們在FireBreath中調用這個庫。 (我很幸運,認爲我有一個非常簡單的API)。

+0

感謝您的答覆。如果可能,請分享您的代碼嗎?以便我可以在實施代碼時獲得一個想法。 – user2372247 2013-05-24 06:29:38

+0

我不能分享任何代碼,因爲它屬於我的僱主。網上有很多使用C#創建COM對象的例子。對我來說最難的部分是C++(我是C++新手)並將FB :: Variant轉換爲BSTR,以便字符串可以傳遞給庫。 – making 2013-05-24 13:08:27

+0

你能幫我解釋一下如何在Firebreath的JavaScript頁面註冊我的C#DLL嗎? – user2372247 2013-05-28 13:04:16