如何通过方法将返回的接口变量转换为对象?

时间:2013-05-08 05:08:27

标签: c# c++ interface dllimport

我正在使用c#包装器,在c ++库中,被调用的函数返回一个指向类对象的指针。 在c#包装器中,如果我调用该方法,它将返回一个接口变量。 该接口变量为null,因此我无法获取值。 我应该如何处理该接口变量以获取值。 有人请帮帮我。

在下面的代码中我们有ROOTNET.Interface.NTH1F它是一个接口,其中ROOTNET.NTH1F是一个类

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

在上面我希望将backgroung删除的值保存为bkg,但bkg包含全部零,请你帮我把背景删除的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;
}

1 个答案:

答案 0 :(得分:1)

您不能将从C ++返回的指针值视为接口(除非它是一个COM接口,我猜)。 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();

希望这有帮助。