0

次の問題があります。関数を含むC++ dllがあります

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

次に、クラスを持つC#dllがあります

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);
 }
}

//関数 Free () は次のようになります。

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

私はC#アプリケーションからそれを呼び出します

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

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

より明確にするために:C#アプリケーションは、一部のタイプの入力では終了し、他のタイプではクラッシュする可能性があるため、呼び出し規約に問題があるとは思いませんか?

4

2 に答える 2