簡體   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