我将Matlab函数编译成C库。我在C#应用程序中使用这个库。
如果我第一次在C库中调用我的函数,一切正常,但第二次调用会导致异常 - mlfMyfunc返回空指针insted指向结果的指针(即使在mlfMyfunc调用之后,output1和output2参数也是IntPtr.Zero)
我的DoubleArray
类(mx...
函数的包装器)已经过充分测试,我认为它可以正常工作。
你知道问题可能在哪里吗?
感谢。卢卡斯
C#代码:
using Native;
class MatlabAlgosBridge {
[DllImport("Algos.dll"]
private static extern bool AlgosInitialize();
[DllImport("Algos.dll")]
private static extern void AlgosTerminate();
[DllImport("Algos.dll")]
private static extern bool mlfMyfunc([In] int nargout, ref IntPtr output1, ref IntPtr output2, [In] IntPtr xVar, [In] IntPtr time, [In] IntPtr algoParam, [In] IntPtr Ts, [In] IntPtr codes);
public List<double> Analyze(List<double> xValues) {
double[] result = null;
try {
Native.Mcl.mclInitializeApplication("NULL", 0)
AlgosInitialize();
DoubleArray xValM = DoubleArray.CreateMatrix(xValues.Data.Count, 1);
// Other parameter initialization
IntPtr output1 = IntPtr.Zero;
IntPtr output2 = IntPtr.Zero;
mlfMyfunc(2, ref output1, ref output2, xValM.Pointer, time.Pointer, params.Pointer, ts.Pointer, codes.Pointer);
result = new MArray(output1).AsDoubleVector();
}
finally {
AlgosTerminate();
Native.Mcl.mclTerminateApplication();
}
return result;
}
}
解决方案:
问题是由重复的Matlab引擎初始化引起的。每次我调用Analyze函数时,引擎都会被初始化(Native.Mcl.mclInitializeApplication
],即使它在Native.Mcl.mclTerminateApplication
块中被正确终止(finally
),重复初始化也会出错。内置的matlab函数仍然存在工作正常,但我的图书馆没有。
解决方案是将mclInitializeApplication
调用移出Analyze函数并确保在应用程序生命周期内仅调用一次。
答案 0 :(得分:2)
问题是由重复的Matlab引擎初始化引起的。每次我调用Analyze
函数时,引擎都会被初始化(Native.Mcl.mclInitializeApplication
),即使它在finally块中被正确终止(Native.Mcl.mclTerminateApplication
),重复初始化也会出错。内置的matlab函数仍然可以正常工作,但我的库没有。
解决方案是将mclInitializeApplication
调用移到Analyze
函数之外,并确保在应用程序生命周期内只调用一次。
答案 1 :(得分:0)
尝试使用globalAlloc分配IntPtrs