繁体   English   中英

如何从C#调用C ++函数

[英]How to call a C++ function from c#

我正在尝试调用C#大学提供的C ++函数。 他为我提供了一个dll和以下头文件。

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 ++代码是否需要更改?

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#类型。

如果您与库的开发人员一起工作(由于仅使用他的库),可能值得看一下他提供的C ++ CLI构建,您可以直接使用标准C#进行工作。 您可能需要处理lib代码中vector / stl的使用-用cli List(或其他托管容器)替换它,或找到包装器解决方案(例如此处此处有关SO的各种文章)。
我认为,与基于pinvoke的原始C ++互操作相比,长期解决方案可能会更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM