2012-03-15 3 views
3

C#에서 C++ DLL을 사용하고 싶습니다. C++ DLL은 win32 콘솔 응용 프로그램입니다. 나는 성공적으로 그것을 불렀고 내가 가지고있는 데이터를 C++에서 처리하려고한다. 그러나 DLL을 실행 한 후에 C# 응용 프로그램이 종료됩니다. 즉,이 줄은 다음과 같습니다. GetArrayFromDLL();C#에서 C++ DLL 호출

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++ 선언을 파악하는 것이 도움이됩니다. –

+0

C# 코드에 대해 * fishy *가 없습니다. 어쩌면 C++ dll은 문제 해결 자다 –

+0

ConsoleApplication 네임 스페이스에 혼란스러워한다. 프로젝트의 출력 유형이 콘솔 응용 프로그램 인 것 같습니다. WinForms를 사용하려면 Windows 응용 프로그램으로 설정하십시오. P/Invoke는 항상 나를 위해 목에 통증이 있지만 이러한 리소스는 나를 조금 도와줍니다. http://www.pinvoke.net/ http://www.swig.org/ –

답변

1

내가 C#에서 네이티브 C++를 사용하여 문제를 마샬링 동안 직면 한 주요 문제를 해결합니다. 그 중 하나도 가지고 있지 않은지 확인하십시오. dll이 잘 실행된다고 말했기 때문에 발생할 수있는 유일한 문제는 함수 반환 유형에서 비롯된 것입니다. C 코드가 범인이 아닐 수도 있습니다. dll이어야합니다. dll을 Link to Unmanaged Code Inter OP

+0

당신은 DLL을 만드는 것을 의미합니다. 대부분 – ShivShambo

+0

입니다. dll 코드 또는 그 서명과 프로토 타입을 업로드 할 수 있습니까? –

+0

안녕하세요 rohit..i 코드로 내 질문을 편집했습니다 ... – ShivShambo

1

link to issues of dll import를 가져 오는 동안

또한 기본적으로 C++ 방법의 호출 만이 간단한 방법이있다 호출 규칙 및 엔트리 포인트를 지정하려고합니다. 객체 지향 인터페이스를 중심으로 C- 호출 가능한 래퍼 (함수)를 만들면 언어가 독립적이지만 항상 정확하게 또는 유지 관리되는 것은 아닙니다. 또는 C#과 C++ 사이에서 객체 지향적 인 접착제 언어를 사용할 수 있습니다.

.NET 1.1에서는 접착제 언어가 Managed C++ (요즘 사라졌습니다)입니다.

아마도 C++/CLI가 후속 언어입니다. 이 언어는 관리 세계와 관리되지 않는 세계 사이의 비교적 얇은 계층에 가장 잘 사용되어 매우 잘 통합됩니다.

(실제로 말하자면 : VS2010을 사용하고 어떤 이유로 든 4보다 오래된 .NET을 대상으로하는 경우 C++/CLI 코드를 추가하면 시스템에 VS 2008도 설치해야하지만 VS2010 IDE 세 언어 모두.)