2013-05-08 2 views
0

C# 래퍼를 사용하고 있으며 C++ 라이브러리에서 호출 된 함수는 클래스 개체에 대한 포인터를 반환합니다. C# 래퍼에서 해당 메서드를 호출하면 인터페이스 변수가 반환됩니다. 해당 인터페이스 변수가 null이므로 값을 가져올 수 없습니다. 값을 얻으려면 해당 인터페이스 변수를 어떻게 처리해야합니까? 누구든지 도와주세요. 아래의 코드에서 메서드에 의해 반환 된 인터페이스 변수를 객체로 변환하는 방법은 무엇입니까?

우리는 ROOTNET.Interface.NTH1F 그것이 ROOTNET.NTH1F 클래스 임은 backgroung에 제거 값을 기대 위에서

using ROOTNET.Utility; 
using ROOTNET.Interface; 

NTH1F g = new ROOTNET.NTH1F("g", "background removal", doubleArrayX.Length - 1,  
    doubleArrayX); 

g.SetContent(doubleArrayY); 
g.GetXaxis().SetRange(xmin, xmax); 

ROOTNET.NTH1F bkg = new ROOTNET.NTH1F(g); 
bkg.Reset(); 

bkg.Add(g.ShowBackground(80, "")); 

에게 BKG하지만 BKG에 저장되어야하는 인터페이스이며,이 모두 0을 포함하고 있습니다. 백그라운드에서 g의 값을 bkg로 가져 오는 것을 도와 주시겠습니까? ShowBackground(int niter, string option) 방법의 코드가

public unsafe virtual NTH1 ShowBackground (int niter, string option) 
{ 
    NetStringToConstCPP netStringToConstCPP = null; 
    NetStringToConstCPP netStringToConstCPP2 = new NetStringToConstCPP (option); 
    NTH1 bestObject; 
    try 
    { 
     netStringToConstCPP = netStringToConstCPP2; 
     int num = *(int*)this._instance + 912; 
     bestObject = ROOTObjectServices.GetBestObject<NTH1> (calli ((), this._instance, niter, netStringToConstCPP.op_Implicit(), *num)); 
    } 
    catch 
    { 
     ((IDisposable)netStringToConstCPP).Dispose(); 
     throw; 
    } 
    ((IDisposable)netStringToConstCPP).Dispose(); 
    return bestObject; 
} 
+0

나는 가까운 투표에 동의하지 않습니다. _specific_이지만 _local_는 아닙니다. 나는이 질문이 앞으로는 방문자가 다시 물어 보지 않을지라도 볼 수있다. 앞으로 질문을 마감 할 투표를하십시오. –

+0

누구든지 제발 도와주세요, 제가 질문을 제대로하지 않은 경우 미안 해요, 나는 학습자입니다. – UserCSharp

+0

시도한 것에 대한 몇 가지 예를 제공해주십시오. 코드입니다. –

답변

0

대로 (그것이 COM 인터페이스 않는 한, 내 생각) 당신은 인터페이스로 ++ C에서 반환 된 포인터 값을 처리 할 수 ​​

. C++과 C# 클래스와 인터페이스는 서로 다른 저수준 구조를 가질 수 있기 때문에 단순히 하나만 다른 것을 전달할 수는 없습니다.

유일한 방법은 라이브러리에 의해 반환 된 C++ 클래스의 주위에 다른 래퍼를 작성하는 것입니다. 그것은 더 적은처럼 보일 것입니다 :

C++/DLL :

__declspec(dllexport) void * ReturnInstance() 
{ 
    return new MyClass(); 
} 

__declspec(dllexport) void MyClass_CallMethod(MyClass * instance) 
{ 
    instance->Method(); 
} 

C 번호 :이 도움이

[DllImport("MyDll.dll")] 
private static extern IntPtr ReturnInstance(); 

class MyClassWrapper 
{ 
    private IntPtr instance; 

    [DllImport("MyDll.dll")] 
    private static extern void MyClass_CallMethod(IntPtr instance); 

    public MyClassWrapper(IntPtr newInstance) 
    { 
     instance = newInstance; 
    } 

    public void Method() 
    { 
     MyClass_CallMethod(instance); 
    } 
} 

// (...) 

IntPtr myClassInstance = ReturnInstance(); 
MyClassWrapper wrapper = new MyClassWrapper(myClassInstance); 
wrapper.Method(); 

희망.

+0

는 예를 – UserCSharp

+0

주셔서 감사하지만, 여기에 C++의 클래스 또는 인터페이스를 반환하면 나도는 C++ DLL의 소스 코드 나 C#을 래퍼 DLL – UserCSharp

+1

이 없습니다. 그렇다면 DLL을 자신의 DLL에 랩핑하고 C++ 래퍼 용 ​​C# 래퍼를 작성하면 작동합니다. 그러나이 프로젝트를 시작하기 전에 DLL 및 P/Invoke 메커니즘에 대한 충분한 지식이 있어야합니다. 왜냐하면 내가 읽은 것으로 판단 할 때 약간의 압도를받는 것 같기 때문입니다. – Spook

관련 문제