通过Firebreath框架从javascript中暴露c#类

本文关键字:暴露 javascript Firebreath 框架 通过 | 更新日期: 2023-09-27 18:13:01

我需要在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框架从javascript中暴露c#类

如果你有任何关于这个的想法请告诉我。

你说的"广义解"…您指的是自动化此操作的工具或过程吗?

我相信这是可能的。我是这样做的:

我假设你已经开始使用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中调用该库的包装器函数。