C#の大学から提供されるC++関数を呼び出そうとしています。彼は私にdllと次のヘッダファイルを提供してくれました。私は、次のエラーが発生し、上記のC++関数を呼び出すために、次のC#コードを使用してい CからC++関数を呼び出す方法#
#include "../libs/tfvo.h"
extern "C" __declspec(dllexport) vector<double> fvm(
vector<double> yearFractions,
vector<double> discountFactors,
vector<double> weightings,
double alpha_meanReversion,
double sigma_meanReversion,
double alpha_shortRate,
double alpha_meanReversion,
double sigma_shortRate,
vector<double> startingValues = vector<double>(3,0.01));
C++ヘッダ。
"保護されたメモリを読み書きしようとしましたが、これは他のメモリが壊れていることを示していることがよくあります。
どのようにC#でこの関数を呼び出しますか? C++コードは変更する必要がありますか?
C#
var result = SimpleDllTest.testWrapper(); // In a console app
class SimpleDllTest
{
[DllImport("fvm.dll")]
public static extern IntPtr fitVasicekModel(
IntPtr yearFractions,
IntPtr weightings,
double alpha_meanReversion,
double sigma_meanReversion,
double alpha_shortRate,
double sigma_shortRate,
IntPtr startingValues
);
public static double [] testWrapper()
{
var t = new double[] { 0.1, 1.2 };
var v = new double[] { 0.1, 1.2 };
int size = Marshal.SizeOf(t[0]) * t.Length;
IntPtr pnt = Marshal.AllocHGlobal(size);
Marshal.Copy(t, 0, pnt, t.Length);
int sizev = Marshal.SizeOf(v[0]) * v.Length;
IntPtr pntv = Marshal.AllocHGlobal(sizev);
Marshal.Copy(v, 0, pntv, v.Length);
IntPtr result = fitVasicekModel(pnt, pnt, 1, 1, 1, 1, pntv);
try
{
return (double[])Marshal.PtrToStructure(result , typeof(double[]));
}
finally
{
// Free the pointer here if it's allocated memory
}
}
}
詳しい背景: 私の大学は、いくつかの金融関連の計算を開発していると私は、最小限の労力で、我々は別のC#アプリケーションでの彼のライブラリ全体を再利用することができます期待しています。私はこの分野で非常に最小の経験を持っています(エクスポート可能なC++コードを作成してC#で使用しています)ので、他のヒントなども歓迎されます。
提供された署名とpinvokeインポートをもう一度見てください。それは[唯一の]問題ではないが、それは一致しない。 –
大学でC++ CLIの下でコードをコンパイルすることは可能ですか? – Ricibob
@Ricibob - わかりませんが、それはオプションです。調査するつもりです – Ahmad