2011-11-09 27 views
0

C#の大学から提供されるC++関数を呼び出そうとしています。彼は私にdllと次のヘッダファイルを提供してくれました。私は、次のエラーが発生し、上記のC++関数を呼び出すために、次のC#コードを使用してい Cから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#

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#で使用しています)ので、他のヒントなども歓迎されます。

+0

提供された署名とpinvokeインポートをもう一度見てください。それは[唯一の]問題ではないが、それは一致しない。 –

+0

大学でC++ CLIの下でコードをコンパイルすることは可能ですか? – Ricibob

+0

@Ricibob - わかりませんが、それはオプションです。調査するつもりです – Ahmad

答えて

0

ライブラリの開発者と協力して(彼のlibのみを使用しているため)、標準のC#で直接作業できるC++ CLIビルドを提供することができます。あなたは、libコードのベクトル/ stlの使用に対処する必要があります - これをcli List(または他の管理されたコンテナ)に置き換えるか、ラッパーソリューションを見つけてください(例えばherehereに関する様々なSOの投稿があります)。
私は、C++に基づくpinvokeベースのinteropよりも長期的な解決が容易になると思います。

1

この関数をC#から直接呼び出す機会はありません。 vector<>は、C#int[]とは関係ありません。

C#タイプからC++タイプへの変換や、C++タイプからC#タイプへの変換ができるように、管理されたC++ラッパーにC#ライブラリをラップすることが最善の方法です途中で。

関連する問題