2009-03-06 18 views
0

私は以下の問題があります。C#データ割り当ての問題

public static void Free (IntPtr ptr) 
{ 
    Marshal.FreeHGlobal (ptr); 
} 

I:私は

void cpp_send (void *data_, size_t size_, free_fn *ffn_) 
{ 
    //sends data 
} 

その後、私は

public class CS_dll : IDisposable 
{ 
    void cs_send (void *data) 
    { 
     IntPtr ptr = Marshal.AllocHGlobal (data.Length); 
     Marshal.Copy (data, 0, ptr, data.Length); 
     try 
     { 
      cpp_send (ptr, 
      Convert.ToUInt32 (data.Length), Free); 
     } 
catch 
{ 
    Free (ptr); 
} 
} 

は//)(フリー機能がどのように見えるクラスを持つC#のDLLを持っている機能を含む、C++のdllを持っていますC#のアプリケーションから呼び出す

CS_dll w = new CS_dll(); 
byte [] msg = new byte [msg_size]; 
w.cs_send (msg, msg_size); 

問題は、しばらくしてから、C#アプリケーションがSystemAccessViolationExcetpionでクラッシュすることです。 問題がどこにあるか分かりますか?

明確にするには:いくつかのタイプの入力ではC#のアプリケーションを終了できますが、他はクラッシュするので、呼び出し規約に問題はありませんか?

+0

send関数:= cs_send(msg、msg_size)? – lakshmanaraj

+0

AccessViolationExceptionの原因となっているコードは何行ですか? –

+0

AVはアンマネージコードによって引き起こされます。あなたのcpp_send()関数。あなたが投稿しなかったコード。 –

答えて

0

「data.Length」とは何ですか?データが宣言されている場合は、省略してください。

UPDATE:関数に渡すコールバック(デリゲート)がstdcallを使用している可能性がありますが、アンマネージ関数はcdecl呼び出し規約を想定している可能性があります。

1

あなたは3つだけを受け取る関数に5つのパラメータを送りますか?

編集:コードを修正していただきありがとうございます。あなたはそれがいくつかのタイプのデータで失敗すると言います。あなたはどんなタイプを言うことができますか?

+0

それは送信しようとするメッセージの数に依存しますが、それは約100000でクラッシュしますが、すべてのベローでうまく動作します。 –

+0

多分、C++プロセスは非常に多くの量のデータのためのポインタを割り当てることができませんか?それ自体で働いたのですか? – gbianchi