C ++ DLL-вызов из C # - PullRequest
       5

C ++ DLL-вызов из C #

3 голосов
/ 15 марта 2012

Я хочу использовать C ++ DLL из C #.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());

        }
    }
}

Это DLL, которую я написал в приложении win32.

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 ]

1 голос
/ 15 марта 2012

В принципе, есть только два простых подхода к вызову методов C ++.Либо создайте C-вызываемые оболочки (функции) вокруг вашего объектно-ориентированного интерфейса, что делает его независимым от языка, но не всегда точно красивым или поддерживаемым, либо вы можете использовать объектно-ориентированный язык склеивания между C # и C ++.

In.NET 1.1, склеивающим языком был Managed C ++ (в наши дни его уже нет).

Его преемником, который, вероятно, является лучшим выбором для вас, является C ++ / CLI.Этот язык лучше всего использовать только для относительно тонкого слоя между вашим управляемым и неуправляемым миром, который он может довольно легко объединить.

(Практически говоря: если вы используете VS2010 и ориентируете .NET старше 4-х, то любойПо этой причине добавление кода C ++ / CLI заставит вас также установить VS 2008 в вашей системе, но вы все равно сможете полностью использовать IDE VS2010 для всех трех языков.)

1 голос
/ 15 марта 2012

основные проблемы, с которыми мне пришлось столкнуться при использовании нативного c ++ в c #, это маршалинг проблем.проверьте, чтобы убедиться, что у вас нет ни одного из них.и так как вы сказали, что dll выполняется нормально, то единственная проблема, которая может возникнуть, - это тип возвращаемых функций.Код C не может быть виновником, это должен быть dll.

Также попробуйте указать соглашение о вызовах и точку входа при импорте dll

ссылки на проблемы импорта dll

Ссылка на неуправляемый код Интер OP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...