Matlab関数をCライブラリにコンパイルしています。私はC#アプリケーションからこのライブラリを使用しています。
Cライブラリで関数を初めて呼び出すと、すべて正常に機能しますが、2番目の呼び出しで例外が発生します-mlfMyfuncは、結果へのnullポインター挿入ポインターを返します(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関数の外に移動し、アプリケーションの存続期間中に1回だけ呼び出されるようにすることです。