我需要在c#中创建类,并通过c++ CLI和Firebreath框架从javascript调用这些类。创建复杂的层次结构类结构并从javascript
公开它流程应该是:
Javascript <-- C++(FireBreath)<-- C#
C#-->C++(Firebreath)-->Javascript
我必须为这个问题创造一个广义解。
那么我应该如何实现这个?如果你有任何解决方案,信息,方法来解决这个问题,请告诉我。
假设我的c#类库包含如下类:
public class TestImage
{
}
public class DrawImage
{
public void ShowImage(TestImage testImage)
{
}
}
这里我需要从Firebreath框架的JavaScript页面调用ShowImage(TestImage TestImage)方法。我已经创建了包装器,但我没有一个想法公开类对象作为参数的方法,就像上面的ShowImage()在Fireabreath框架的JavaScript页面。
你说的"广义解"…您指的是自动化此操作的工具或过程吗?
我相信这是可能的。我是这样做的:
我假设你已经开始使用FireBreath并对它有一些了解。我掩盖了无数的问题,你会遇到整合所有这些在FireBreath解决方案;那得花好几天!这只是建筑学上的建议。我很抱歉省略了这么多细节。
我会写一个工具来动态加载你的。net程序集,并使用反射来遍历"复杂的层次结构类结构"。该工具将生成两件事:为。net库生成一个c++/CLI包装器,以及一组本地c++ FireBreath类,这些类从Javascript绑定到该c++/CLI包装器。
c++/CLI包装器(见这里的输入链接描述)使你的。net库可以从FireBreath的本地c++中调用。实际上,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::Start和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层时是如何表示的。
我刚刚用COM实现了类似的东西。我将c#库作为COM对象公开,然后编写了几个在FireBreath中调用该库的包装器函数。