2013-05-11 4 views
0

나는 C#에서 클래스를 생성하고 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 Framework의 JavaScript 페이지에서 위의 ShowImage()와 같은 메서드에 클래스 개체를 노출하는 아이디어가 없습니다.

관련 사항이 있으면 알려 주시기 바랍니다.

답변

2

"일반화 된 솔루션"이라고 할 때 ... 이것을 자동화하는 도구 또는 프로세스를 의미합니까?

나는 이것이 가능하다고 믿습니다. 여기에 내가 어떻게 할 것인가 :

나는 당신이 FireBreath를 시작하고 그것을 이해했다고 가정하고있다. FireBreath 솔루션에서이 모든 것을 통합 할 때 셀 수없이 많은 문제를 해결할 것입니다. 그건 며칠 걸릴거야! 그래서 이것은 단지 건축 조언 일뿐입니다. 너무 많은 세부 사항을 생략해서 죄송합니다.

.NET 어셈블리 또는 어셈블리를 동적으로로드하는 도구를 작성하고 리플렉션을 사용하여 '복잡한 계층 구조 클래스 구조'를 탐색합니다. 이 도구는 .NET 라이브러리 용 C++/CLI 랩퍼와 Javascript에서 해당 C++/CLI 랩퍼로 바인드하는 네이티브 C++ FireBreath 클래스 세트를 생성합니다.

C++/CLI 래퍼 (enter link description here 참조)는 FireBreath의 네이티브 C++에서 .NET 라이브러리를 호출 할 수있게합니다. 실제로 래퍼를 생성한다고 주장하는 곳은 a tool on CodePlex입니다.

자바 스크립트 어댑터는 .cpp 모듈 집합입니다 (아마도 각 라이브러리/C++/CLI 클래스에 하나씩). 이들 각각은 FB :: JSAPIAuto에서 파생 된 C++ 클래스로,이 클래스를 Javascript 객체로 인스턴스화 할 수 있습니다. 이러한 각 클래스의 생성자 내에서 자동화 된 도구는 객체의 Javascript API를 만드는 코드를 삽입합니다. 다음과 같습니다 코드 : thisClass가 시작 thisClass :: set_Size ::처럼

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)); 

자동화 된 도구는 클래스의 이러한 방법을 합성해야합니다. 그들의 매개 변수와 리턴 타입은 int, double, bool과 같은 FireBreath가 지원하는 Javascript 호환 유형이지만 std :: string, FB :: VariantMap 및 FB :: VariantList도 있습니다.이러한 각 메소드의 본문에서 도구는 해당 C++/CLI 랩퍼 API를 호출하는 코드를 생성하여 매개 변수와 리턴 사이에 필요한 변환을 수행합니다.

각 FB :: JSAPIAuto 파생 클래스가 나타내는 C++/CLI 클래스/개체에 대한 포인터를 구성원으로 보유하고 있거나 보유하고 있다고 가정합니다.

FireBreath 프로젝트에서 .NET 라이브러리는 궁극적으로 GUID로 표현됩니다.이 GUID에서 루트 객체를 생성하면 Javascript가 라이브러리로 들어가는 방식입니다. 그런 다음 메소드를 호출하거나 해당 객체의 속성을 읽어 다른 객체를 가져 오는 등의 작업을 수행하여 전체 라이브러리 API에 액세스합니다.

Javascript와 C# 사이에 몇 가지 문제 매핑이 있다고 가정합니다. Firebreath에서 지원하는 Javascript 매개 변수와 반환 유형을 연구하고 이에 따라 C# API를 제한해야합니다. 아마도 열쇠는 Javascript 객체와 배열이 C++/CLI 계층을 교차 할 때 표현되는 방법을 알아내는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 선의 의미를 말해 주시겠습니까? .NET 어셈블리 또는 어셈블리를 동적으로로드하는 도구를 작성하고 리플렉션을 사용하여 '복잡한 계층 구조 클래스 구조'를 탐색합니다. 이 도구는 .NET 라이브러리 용 C++/CLI 래퍼와 Javascript에서 해당 C++/CLI 래퍼에 바인딩하는 네이티브 C++ FireBreath 클래스 집합을 생성합니다. – user2372247

+0

가능하면 코드를 공유해 주시겠습니까? 코드를 구현하는 동안 아이디어를 얻을 수 있도록 노력하겠습니다. – user2372247

+0

Firebreath의 JavaScript 페이지에서 C# Dll을 등록하는 방법을 알려 주실 수 있습니까? – user2372247

0

저는 COM을 사용하여 이와 같은 것을 달성했습니다. COM 개체로 C# 라이브러리를 노출 한 다음 FireBreath에서이 라이브러리를 호출하는 몇 가지 래퍼 함수를 ​​작성했습니다. (나는 아주 간단한 API를 가지고 있다는 행운의 생각이었다.)

+0

답장을 보내 주셔서 감사합니다. 가능하면 코드를 공유해주십시오. 코드를 구현하는 동안 아이디어를 얻을 수 있습니다. – user2372247

+0

내 고용주에게 속한 코드를 공유 할 수 없습니다. NET에서 C#을 사용하여 COM 개체를 만드는 예가 많이 있습니다. 나를 위해 가장 어려운 부분은 C++ (저는 C++ 초보자였습니다)와 FB :: Variant를 BSTR로 변환하여 문자열을 라이브러리로 전달할 수있게했습니다. – making

+0

Firebreath의 JavaScript 페이지에서 내 C# dll을 등록하는 방법을 알려주십시오. – user2372247