C# 如何调用C++;来自c的函数# 我试图调用C++中的一个学院提供的C++函数。他为我提供了一个dll和以下头文件 C++标题
更多背景:C# 如何调用C++;来自c的函数# 我试图调用C++中的一个学院提供的C++函数。他为我提供了一个dll和以下头文件 C++标题,c#,pinvoke,C#,Pinvoke,更多背景: 我的学院已经开发了几个与财务相关的计算,我希望我们能尽可能少的努力在另一个C#应用程序中重用他的整个库。他和我都有非常少的经验(创建可导出的C++代码并在C语言中使用),因此欢迎任何其他提示。p> 如果您与库的开发人员一起工作(习惯于只使用他的库),那么他提供的C++CLI构建可能值得一看,您可以直接使用标准C#。您需要在lib代码中处理vector/stl的使用-或者用cli列表(或其他托管容器)替换它,或者找到一个包装解决方案(关于eg和的SO帖子有很多)。 我认为这可能比PrP
我的学院已经开发了几个与财务相关的计算,我希望我们能尽可能少的努力在另一个C#应用程序中重用他的整个库。他和我都有非常少的经验(创建可导出的C++代码并在C语言中使用),因此欢迎任何其他提示。p> 如果您与库的开发人员一起工作(习惯于只使用他的库),那么他提供的C++CLI构建可能值得一看,您可以直接使用标准C#。您需要在lib代码中处理vector/stl的使用-或者用cli列表(或其他托管容器)替换它,或者找到一个包装解决方案(关于eg和的SO帖子有很多)。
我认为这可能比PrPoCKE为基础C++的互操作更容易解决。
向量
与C#int[]
没有关系
<>你最好把一个C语言库包在一个满是C++的包装器中,这样你就可以在输入的方式中从C类型到C++类型进行翻译,并且在退出的时候从C++类型映射到C类型,查看所提供的签名和pvIKE再次导入。并不是说这是唯一的问题,但它并不匹配。你们学校是否有可能在C++CLI下编译他的代码?@Ricibob-不确定,但这是一个选项。意志investigate@pst-您能否同时强调其他问题。当你说签名不匹配时,我是否应该将C方法sig更改为使用
double[]
?
#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));
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
}
}
}