来自C#的C ++ DLL调用

时间:2012-03-15 05:11:29

标签: c# c++ dll exit

我想使用C#中的C ++ DLL。 C ++ DLL是win32控制台应用程序。我已成功调用它并希望在c#中处理c ++中的数据。但是,在执行DLL之后,C#应用程序退出,即此行:GetArrayFromDLL();

我是C#和Visual C ++的新手。有人可以提供一些建议吗?

由于

namespace ConsoleApplication1
{
    class Program
    {

        [DllImport("Lidar_DataCal_CDLL.dll")]

        public static extern void GetArrayFromDLL();



        static void Main(string[] args)
        {
            Console.WriteLine("This is C# program");
            GetArrayFromDLL();
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}

这是我在win32应用程序中编写的DLL。

extern "C"
{
  __declspec(dllexport) void GetArrayFromDLL()
  {

/// Reading hex from a file 

  FILE * pFile;

  FILE * f;

  signed int array_data[81],array_data1[81],i;

  double fangle,fsin,fcos,fangle_rad;

  double afx[81],afy[81];

  int px,py;

  char file_read[20] = "scandataset1.txt";

  char file_write[20] = "xycordinates1.txt";


  pFile = fopen ( file_read,"a+");

  if (pFile != NULL)

      {
  for (i=0;i<80;i++)

      {
       char buffer[3];

       fscanf (pFile, "%x",&array_data[i]);

      sprintf ( buffer ,"%d", array_data[i]);

      printf ( "I have read: %s \n\n", buffer);

      array_data1[i] = atoi(buffer);

       // finding angle 

       fangle = 20 -( (i+1-1)*0.5);

       fangle_rad = (PI*fangle/180);

       fsin = -sin(fangle_rad);

       fcos =  cos(fangle_rad);

       afx[i] = array_data[i] * fsin;

       afy[i] = array_data[i] * fcos;

      // printf ("X: %lf  and Y: %lf  \n\n",afx[i],afy[i]);

       f = fopen(file_write,"a+");

       if(f != NULL);

       fprintf(f,"%lf %lf\n",afx[i],afy[i]);

       fclose (f);

      } 
      }
  else
      {

      printf("Error opening fail");

      }

  fclose (pFile);
      }

    }

2 个答案:

答案 0 :(得分:1)

在c#中使用本机c ++时我必须面对的主要问题是编组问题。检查以确保您没有任何这些。既然你已经告诉dll执行正常,那么唯一可能出现的问题就是函数返回类型。 C代码可能不是罪魁祸首,它必须是dll。

在导入dll时尝试指定调用约定和入口点

link to issues of dll import

Link to Unmanaged Code Inter OP

答案 1 :(得分:1)

基本上只有两种直接调用C ++方法的方法。在面向对象的接口周围创建C可调用包装器(函数),这使得它与语言无关,但并不总是非常漂亮或可维护,或者您可以在C#和C ++之间使用面向对象的粘合语言。

在.NET 1.1中,粘合语言是托管C ++(现在它已经消失了。)

它的后继语言可能是您的最佳选择,是C ++ / CLI。这种语言最适合用于托管和非托管世界之间相对较薄的层,它能够很好地统一。

(实际上说:如果你使用的是VS2010,并且任何原因都是针对4岁以上的.NET,那么添加C ++ / CLI代码会迫使你在你的系统上同时安装VS 2008,但你仍然可以完全使用VS2010 IDE这三种语言。)