[英]How to call a C++ delegated function from C#, when C++ call C# functions?
[英]How to call a C++ function from c#
我正在尝试调用C#大学提供的C ++函数。 他为我提供了一个dll和以下头文件。
#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#中使用它),因此将欢迎其他任何技巧。
您没有机会直接从C#调用此函数。 vector<>
与C# int[]
没有关系。
最好的选择是将C#库包装在一个托管的C ++包装器中,这样您就可以在导入过程中将C#类型转换为C ++类型,并在导出过程中将C ++类型映射为C#类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.