2012-03-15 12 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でなければなりません。

また、基本的にはC++メソッドの呼び出しに2つだけ簡単なアプローチがある

link to issues of dll import

Link to Unmanaged Code Inter OP

+0

DLLの作成では、ほとんどが – ShivShambo

+0

という問題があります。 DLLコードまたはその署名とプロトタイプをアップロードできますか? –

+0

こんにちはrohit..iは私の質問をコードで編集しました... – ShivShambo

1

DLLのインポート中に呼び出し規約およびエントリポイントを指定してみてください。あなたのオブジェクト指向のインターフェイスの周りにC-呼び出し可能なラッパー(関数)を作成すると、言語に依存しませんが、常に正確に美しく保守できない場合や、C#とC++の間でオブジェクト指向のグルー(glue)言語を使用できます。

.NET 1.1では、グルー(glue)言語はManaged C++でした(最近はなくなっています)。

おそらくあなたのための最良の選択であるその後継言語はC++/CLIです。この言語は、管理された世界と管理されていない世界の間の比較的薄い層のためだけに使用され、非常にうまく統一できます。

(具体的には、何らかの理由でVS2010を使用していて、何らかの理由で.NETを対象としている場合、C++/CLIコードを追加するとVS20010もシステムにインストールされますが、VS2010 IDE )。

関連する問題