Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用C++;来自c的函数# 我试图调用C++中的一个学院提供的C++函数。他为我提供了一个dll和以下头文件 C++标题_C#_Pinvoke - Fatal编程技术网

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
        }
    }
}