0

我需要在 C# 中创建类并通过 C++CLI 和 Firebreath 框架从 javascript 调用这些类。创建复杂的层次结构类结构并从 javacsript 公开它

流程应该是:

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 () 方法。

如果您对此有任何想法,请告诉我。

4

2 回答 2

2

当您说“通用解决方案”时……您是指自动执行此操作的工具或过程吗?

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

我假设您已经开始使用 FireBreath 并对其有所了解。我正在掩饰在将所有这些集成到 FireBreath 解决方案中时会遇到的无数问题;那将需要几天的时间!所以这只是架构建议。很抱歉省略了这么多细节。

我会编写一个工具来动态加载您的.NET 程序集或程序集,并使用反射来遍历“复杂层次结构类结构”。该工具将生成两件事:一个用于 .NET 库的 C++/CLI 包装器,以及一组从 Javascript 绑定到该 C++/CLI 包装器的本地 C++ FireBreath 类。

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 层时是如何表示的。

于 2013-05-20T14:54:10.943 回答
0

我刚刚使用 COM 实现了类似的功能。我将 C# 库作为 COM 对象公开,然后编写了几个在 FireBreath 中调用该库的包装函数。(我很幸运以为我有一个非常简单的 API)。

于 2013-05-23T23:10:42.443 回答