Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Firebreath框架从javascript公开的C#类_C#_Javascript_C++ Cli_Firebreath - Fatal编程技术网

通过Firebreath框架从javascript公开的C#类

通过Firebreath框架从javascript公开的C#类,c#,javascript,c++-cli,firebreath,C#,Javascript,C++ Cli,Firebreath,我需要在C#中创建类,并通过C++CLI和Firebreath框架从javascript调用这些类。。创建复杂的层次结构类结构,并从JavaCScript中公开它 流程应为: Javascript 我必须为这个问题创建一个广义的解决方案 那么我应该如何实现这一点呢?如果你有解决这个问题的方法、信息,请告诉我 假设我的C#类库包含如下类: public class TestImage { } public class DrawImage { public void ShowImage(Tes

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

流程应为:

Javascript

我必须为这个问题创建一个广义的解决方案

那么我应该如何实现这一点呢?如果你有解决这个问题的方法、信息,请告诉我

假设我的C#类库包含如下类:

public class TestImage
{
}

public class DrawImage
{ 
 public void ShowImage(TestImage testImage)
 {
 }
}
在这里,我需要从Firebreath Framework的JavaScript页面调用ShowImage(TestImage TestImage)方法。 我已经创建了包装器,但是我不想将类对象作为参数公开给方法,就像上面Fireabreath框架的JavaScript页面中的ShowImage()一样

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

当您说“广义解”时。。。你是说一个自动化的工具或过程吗

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

我假设你已经开始使用FireBreath,并且对它有一些了解。我在掩饰你将在FireBreath解决方案中遇到的无数问题;那要花几天时间!所以这只是架构上的建议。很抱歉遗漏了这么多细节

我将编写一个工具,动态加载.NET程序集,并使用反射遍历“复杂的层次结构类结构”。这个工具将生成两个东西:一个用于.NET库的C++ /CLI包装器,以及一组从JavaScript绑定到C++ /CLI包装器的本地C++ Fix呼吸类。

C++ +CLI包装器(参见)使您的.NET库可以从FixSudio的本机C++调用。 实际上,这里是一个声明生成这样一个包装器

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\u 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中调用该库。(我很幸运,因为我有一个非常简单的API)。

谢谢你的回复。你能告诉我这些行的含义吗?我将编写一个工具,动态加载.NET程序集,并使用反射遍历“复杂的层次结构类结构”。此工具将生成两个东西:用于.NET库的C++/CLI包装器,一组从JavaScript绑定到C++ + CLI包装器的本地C++ Fix呼吸类?如果可能的话,请大家分享你的代码,这样我可以在实现代码的同时得到一个想法。请帮助我如何在FixSub的JavaScript页面登记我的C dll DLL,让我知道。你不能登记JavaScript中的C。我甚至不知道那是什么意思。你可以从FixSug插件内部的C++代码中调用C。您可以注册Firebreath插件,以便可以从Javascript访问它。其中每一个都是一个大的领域,建议您先进行研究,然后就您不理解的内容或不起作用的内容提出具体问题。“如果可能,请分享您的代码”—抱歉,它属于我的雇主。谢谢你的回复。如果可能的话,你能分享你的代码吗?这样我可以在实现我的代码时得到一个想法。我不能分享任何代码,因为它属于我的雇主。网上有很多使用C#创建COM对象的例子。对我来说最困难的部分是C++(我是C++新手),并将fb::变量转换成BSTR,这样字符串就可以传递给库。请帮助我如何在FixSub的JavaScript页面中登记我的C?dll,正如我所说的,我把我的C语言作为一个COM对象(有很多例子在网上)。然后使用regasm注册。我已经编辑了关于我应该实现什么的问题,在代码的帮助下提到了这些事情。如果你对此有任何想法,请告诉我。