【问题标题】:C++ DLL call from C#从 C# 调用 C++ DLL
【发布时间】:2012-03-15 05:11:29
【问题描述】:

我想使用 C# 中的 C++ DLL。 C++ DLL 是 win32 控制台应用程序。我已成功调用它,并希望在 c# 中处理我从 c++ 获得的数据。然而,C# 应用程序在执行 DLL 后退出,即这一行: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);
      }

    }

【问题讨论】:

  • 了解相关函数的精确 C++ 声明会有所帮助。
  • c# 代码没有任何可疑。也许 c++ dll 是麻烦制造者
  • 我对命名空间 ConsoleApplication 感到困惑。我怀疑您项目的输出类型是控制台应用程序。将其设置为 Windows 应用程序以使用 WinForms。 P/Invoke 总是让我头疼,但这些资源对我有一点帮助:pinvoke.netswig.org
  • 我绝对同意控制台应用程序是 Visual Studio 中控制台应用程序的默认名称,即使它只是一个名称。
  • 感谢您的建议。是的。我使用默认名称..我正在尝试在此处发布 DLL 代码..

标签: c# c++ dll exit


【解决方案1】:

基本上只有两种直接的方法可以调用 C++ 方法。围绕面向对象的接口创建 C 可调用的包装器(函数),使其独立于语言,但并不总是完全漂亮或可维护,或者您可以在 C# 和 C++ 之间使用面向对象的胶水语言。

在 .NET 1.1 中,胶水语言是托管 C++(现在已经不存在了)。

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

(实际上:如果您使用 VS2010 并以任何原因定位 .NET 早于 4,添加 C++/CLI 代码将强制您在系统上也安装 VS 2008,但您仍然可以完全使用 VS2010 IDE三种语言。)

【讨论】:

    【解决方案2】:

    在 c# 中使用原生 c++ 时我必须面对的主要问题是 编组 问题。检查以确保您没有任何这些。并且由于您已经告诉 dll 执行良好,那么唯一可能出现的问题是函数返回类型。 C代码可能不是罪魁祸首,它一定是dll。

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

    link to issues of dll import

    Link to Unmanaged Code Inter OP

    【讨论】:

    • 你的意思是在创建DLL的时候,有问题
    • 主要是。你能上传dll代码或其签名和原型吗?
    • 还尝试在 try catch 块中调用 dll 中的函数,以检查是否存在异常(如果有)。还要确保您的 c++ 代码单独运行良好。
    • 这是我得到的控制台命令。这是 C# 程序线程 '' (0x1820) 已退出,代码为 0 (0x0)。程序“[0xC98] ConsoleApplication1.vshost.exe: Managed (v4.0.30319)”已退出,代码为 1073741855 (0x4000001f)。
    • 我认为代码 0 (Ox0) 是完美执行所获得的。您可以将该输出窗口详细信息添加到问题中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多