次の問題があります。関数を含む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#アプリケーションは、一部のタイプの入力では終了し、他のタイプではクラッシュする可能性があるため、呼び出し規約に問題があるとは思いませんか?