C++ DLL从C#中调用

3
我想在C#中使用一个C++ DLL。这个C++ DLL是Win32控制台应用程序。我已经成功调用它并想要在C#中处理从C++传来的数据。但是,在执行DLL(即这一行: GetArrayFromDLL(); )后,C#应用程序就退出了。
我对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);
      }

    }

4
了解该问题涉及的函数的精确C++声明会有所帮助。 - Jeffrey Hantin
我完全同意在Visual Studio中,控制台应用程序的默认名称是Console Application,尽管这只是一个名称。 - Rohit Vipin Mathews
谢谢您的建议。是的,我使用了默认名称。我正在尝试在这里发布DLL代码。 - ShivShambo
我同意@schlzber的观点,用C#实现这个功能将是最简单的解决方案。 - zmbq
dll函数不返回任何值。你怎么从C#获取函数正在加载的内容? - Daniel Schlößer
显示剩余7条评论
2个回答

1

在使用C#中的本地C++时,我遇到的主要问题是封送问题。请检查确保您没有这些问题。既然您已经说过dll可以正常执行,那么唯一可能出现的问题就是函数返回类型。C代码可能不是罪魁祸首,必须是dll。

导入dll时还可以尝试指定调用约定和入口点

dll导入问题链接

非托管代码互操作链接


在创建 DLL 的过程中,存在问题吗? - ShivShambo
大部分情况下,你能否上传DLL代码或其签名和原型? - Rohit Vipin Mathews
尝试在try catch块中调用dll中的函数以检查是否有异常。同时确保您的C++代码单独运行正常。 - Rohit Vipin Mathews
这是我得到的控制台命令。这是C#程序。 线程'<No Name>' (0x1820)已以代码0(0x0)退出。 程序'[0xC98] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)'已以代码1073741855(0x4000001f)退出。 - ShivShambo
我认为代码0(Ox0)是您获得完美执行的结果。您可以将该输出窗口的详细信息添加到问题中。 - Rohit Vipin Mathews

1

基本上,调用C++方法只有两种直接的方法。一种是在面向对象的接口周围创建C可调用的包装器(函数),这使其独立于语言,但不总是非常美观或可维护;另一种方法是在C#和C++之间使用面向对象的粘合语言。

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

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

实际上,如果您正在使用VS2010并且针对.NET早于4的任何原因,添加C++/CLI代码将迫使您在系统上安装VS 2008,但您仍然可以完全使用VS2010 IDE来处理所有三种语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接