C# 如何在dotnet中使用catboostcapi?

C# 如何在dotnet中使用catboostcapi?,c#,.net-core,pinvoke,dllimport,catboost,C#,.net Core,Pinvoke,Dllimport,Catboost,我正在尝试在C#中使用catboost C API。以下是C语言的工作代码: #include <stdio.h> #include "c_a

我正在尝试在C#中使用catboost C API。以下是C语言的工作代码:

#include <stdio.h>                                                                                                                                                                             
#include "c_api.h"                                                                                                                                                                             

int main(int argc, char** argv){                                                                                                                                                               

  float floatFeatures[3] = {96.215, 1.595655e+09, 3000};                                                                                                                                       
  char* catFeatures[0];                                                                                                                                                                        
  double result[1];                                                                                                                                                                            
  ModelCalcerHandle* modelHandle = ModelCalcerCreate();                                                                                                                                        


  // LoadFullModelFromFile is time consuming                                                                                                                                                   
  if (!LoadFullModelFromFile(modelHandle, "../../test_catboost_model.cbm")) {                                                                                                                  
    printf("LoadFullModelFromFile error message: %s\n", GetErrorString());                                                                                                                     
  }

  // CalcModelPredictionSingle is fast                                                                                                                                                                                                                                                                                                                             
  if (!CalcModelPredictionSingle(modelHandle,                                                                                                                                                  
                                 &floatFeatures, 3,                                                                                                                                            
                                 &catFeatures, 0,                                                                                                                                              
                                 &result, 1                                                                                                                                                    
                                 )) {                                                                                                                                                          
    printf("CalcModelPrediction error message: %s\n", GetErrorString());                                                                                                                       
  }

  ModelCalcerDelete(modelHandle);                                                                                                                                                              

  printf("model score is %.20f", result[0]);                                                                                                                                                   

  return 0;                                                                                                                                                                                    
}
相关的C头文件如下所示。整个文件在上可用


如有任何建议,我们将不胜感激。谢谢大家!

事实证明,我不应该在CalcModelPredictionSingle的签名中的“double[]result”之前使用“out”关键字,这样就可以解决问题

下面的工作

   [DllImport("catboostmodel")]
    private static extern bool CalcModelPredictionSingle(
        IntPtr modelHandle,
        float[] floatFeatures, ulong floatFeaturesSize,
        string[] catFeatures, ulong catFeaturesSize,
        double[] result, ulong resultSize
    );

我要做的第一件事就是看看你的界面是否正确。您可以使用Catboost中的单个方法来实现这一点,因此我将找到最短、最简单的代码,可以对Catboost进行验证,并确保我可以调用它并返回结果。我想问的一个问题是:“我的DLL导入正确吗?”还是其他问题之一?@RobertHarvey谢谢Robert的快速回答。我可以确认ModelCalcerCreate和LoadFullModelFromFile调用成功,因为返回值已更改。LoadFullModelFromFile返回True。失败的是CalcModelPredictionSingle。CalcModelPredictionSingle是否返回
false
?它返回true
#if defined(_WIN32) && !defined(CATBOOST_API_STATIC_LIB)
#ifdef _WINDLL
#define CATBOOST_API __declspec(dllexport)
#else                                                                                                                                                   
#define CATBOOST_API __declspec(dllimport)
#endif       
#else                                                                                                                                                                      
#define
CATBOOST_API
#endif

typedef void ModelCalcerHandle;

CATBOOST_API ModelCalcerHandle* ModelCalcerCreate();
CATBOOST_API const char* GetErrorString();
CATBOOST_API bool LoadFullModelFromFile(  
    ModelCalcerHandle* modelHandle, 
    const char* filename);
CATBOOST_API bool CalcModelPredictionSingle( 
        ModelCalcerHandle* modelHandle,
        const float* floatFeatures, size_t floatFeaturesSize,
        const char** catFeatures, size_t catFeaturesSize,
        double* result, size_t resultSize);
   [DllImport("catboostmodel")]
    private static extern bool CalcModelPredictionSingle(
        IntPtr modelHandle,
        float[] floatFeatures, ulong floatFeaturesSize,
        string[] catFeatures, ulong catFeaturesSize,
        double[] result, ulong resultSize
    );