2012-03-15 2 views
3

Я хочу использовать C++ DLL из C#. C++ DLL - консольное приложение win32. Я успешно вызвал его и хочу обработать данные, которые у меня есть из C++ в C#. Однако приложение C# завершает работу после выполнения DLL. Эта строка: GetArrayFromDLL();C++ DLL вызов с 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()); 

     } 
    } 
} 

Это 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); 
     } 

    } 
+4

Это поможет узнать точное объявление C++ для данной функции. –

+0

Нет ничего * fishy * о коде C#. возможно, C++ dll является нарушителем проблем –

+0

Я смущен пространством имен ConsoleApplication. Я подозреваю, что тип вывода вашего проекта - консольное приложение. Установите его в приложение Windows для использования WinForms. P/Invoke - это всегда боль в шее для меня, но эти ресурсы помогают мне немного: http://www.pinvoke.net/ http://www.swig.org/ –

ответ

1

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

пытается также указать соглашение о вызовах и точку входа, а импорт DLL

link to issues of dll import

Link to Unmanaged Code Inter OP

+0

вы имеете в виду при создании DLL, есть проблема – ShivShambo

+0

в основном. вы могли бы загрузить DLL-код или его подпись и прототип? –

+0

hi rohit..i отредактировал мой вопрос с кодом ... – ShivShambo

1

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

В .NET 1.1 язык клея был управляемым C++ (в наши дни он пропал без вести).

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

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