0

C#/。netからC++DLLの関数を呼び出そうとしています。データのマーシャリング方法に問題があると思います。関数呼び出しは実行されますが、戻り値(最後の7つの変数)はすべて0に設定され、配列は長さ1に設定されます(これは、処理できないデータを受信したときのDLLの意図された動作であると思います)。

C++DLLは32ビットとしてコンパイルされます。

C++ヘッダーは次のとおりです。

extern "C" __declspec(dllexport) void __stdcall Merchandize(int SppCode,
                                                                  double DBH, 
                                                                  double TotHt, 
                                                                  double CR, 
                                                                  double BTR,
                                                                  int *minDIBs,     //array
                                                                  int *minLens,     //array
                                                                  int *minVols,     //array
                                                                  int NumProducts, //array length
                                                                  int maxLen,       
                                                                  double trimLen,
                                                                  double stumpHt,
                                                                  int logStep,
                                                                  int *logLens,     //array, understood to be 50
                                                                  double *logSEDs,  //array, understood to be 50
                                                                  double *logVols,  //array, understood to be 50
                                                                  int *logGrades,   //array, understood to be 50
                                                                  int *NumberOfLogs,
                                                                  double *merchHt,
                                                                  int *errorFlag)

そして、これがC#dllのインポートです。

    [DllImport("C:\\Users\\Public\\Documents\\FVSNEMerchandizer.dll")]
      static extern void MerchandizeTree(int SppCode, 
                                            double DBH,
                                            double TotHt,
                                            double CR,
                                            double BTR,
                                            ref int[] minDIBs,
                                            ref int[] minLens, 
                                            ref int[] minVols, 
                                            int NumProducts,
                                            int maxLen, 
                                            double trimLen, 
                                            double stumpHt, 
                                            int logStep,
                                            ref int[] logLens, 
                                            ref double[] logSEDs, 
                                            ref double[] logVols,
                                            ref int[] logProds, 
                                            ref int[] numLogs, 
                                            ref double merchHt,
                                            ref int errorFlag);
4

1 に答える 1

2

配列にrefが必要ないことは間違いありません。これは、C++の型がたとえばint*ではなくint**であることを示唆しています。

また、パラメーターの数を減らすと(何らかの構造体に配置することで)、コード全体の速度が上がる可能性があります。プロセッサは大量の引数をプッシュする必要がありますが、多くの引数がある場合は多くの時間がかかります。

于 2012-09-28T14:50:40.857 に答える