如何将方法返回的接口变量转换为对象
本文关键字:变量 转换 对象 接口 方法 返回 | 更新日期: 2023-09-27 18:12:28
我使用c#包装器,在c++库中,被调用的函数返回指向类对象的指针。在c#包装器中,如果我调用该方法,它将返回一个接口变量。该接口变量为空,因此无法获取值。我应该如何处理接口变量以获取值。谁来帮帮我。
在下面的代码中,我们有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, ""));
在上面我希望背景删除值保存在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;
}
您不能将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();