2011-02-04 14 views
0

C#からC++ DLL(borland c builder)を使用しようとしています。DllImport StackOverflowException

#include <vcl.h> 
#include <windows.h> 
#include <fstream.h> 
#pragma hdrstop 
#pragma argsused 
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) 
{ 
    return 1; 
} 
//--------------------------------------------------------------------------- 
#pragma pack (push,1) 
typedef struct  
{ 
    int  a; 
}ABC; 
#pragma pack (pop) 
//--------------------------------------------------------------------------- 

extern "C" void __declspec(dllexport) __cdecl writeParameter(ABC *abc) 
{ 
    ofstream outfile("result.txt"); 
    outfile<< "A=" <<endl; 
    outfile << abc->a <<endl; 
    outfile.close(); 
} 

:正常に動作しますwriteParameter機能は、それがファイルに正しいデータを書き込みますが、その後、私は例外を持って

C++コード「型 『System.StackOverflowException』の未処理の例外はPresentationFramework.dllに発生しました」 c#:

[StructLayoutAttribute(LayoutKind.Sequential)] 
public class ABC 
{ 
    public int a; 
} 
[DllImport("D:\\monitorVC.dll", EntryPoint = "_writeParameter", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
     public static extern void WriteParameter( 
      [In,MarshalAs(UnmanagedType.LPStruct)] 
      ABC abc 
      ); 

     private void Grid_Loaded(object sender, RoutedEventArgs e) 
     { 
       var abc = new ABC() {a = 123}; 
       WriteParameter(abc); 
     } 

答えて

0

class!= struct in C#。

また、C#バージョンとC++バージョンの間で構造のパッキングが同じではありません。

2

このblog postは、UnmanagedType.LPStructの非常に不適切な名前について、誰もがそれをどう考えているのかについては、これを読んでください。このようなあなたの宣言を修正:

[DllImport(...)] 
public static extern void WriteParameter([In] ref ABC abc); 
+0

これは、ABCが構造体のように宣言されていると仮定しています。クラスをそのままにしておけば、* ref *キーワードを削除してください。 –

+0

同じです。関数が機能します(つまり、正しい構造体を取得してファイルに書き込む)が、StackOverflowExceptionが発生します。 – user521304

+0

指定されたコードでは意味がありません。しかし、デバッガ、デバッグ+ Windows +レジスタを使用してください。コールの前後にESPの値を見てください。また、アンマネージコードのデバッグを有効にし、Cコードにブレークポイントを設定してください。 –

0

この質問が投稿されましたので、私はそれはしばらくしていることを知っているが、私はVS2010 C#プロジェクト、CodeGearのC++ Builderの2007年に建てられた.dllにロードしようと同じ経験をしました。

回避策は、すべてのTFormを自分の.dllから削除することでした。私には、これらのフォームからエクスポートされたシンボル(スタックからオーバーフローするまでの "ローディング"をどこで取り除くことができないかによって)がわかりました。

よろしくお願いいたします。