J'ai le problème suivant. J'ai un C++ dll, contenant la fonctionProblème d'allocation de données C#
void cpp_send (void *data_, size_t size_, free_fn *ffn_)
{
//sends data
}
j'ai C# dll qui a une classe
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);
}
}
// La fonction libre() ressemble à:
public static void Free (IntPtr ptr)
{
Marshal.FreeHGlobal (ptr);
}
I l'appeler de l'application C# comme
CS_dll w = new CS_dll();
byte [] msg = new byte [msg_size];
w.cs_send (msg, msg_size);
Le problème est qu'après un certain temps, l'application C# se bloque avec SystemAccessViolationExcetpion. Avez-vous une idée de l'origine du problème? Pour plus de clarté: l'application C# peut se terminer pour certains types d'entrée alors que pour les autres, elle se bloque, donc je ne pense pas qu'il y ait un problème avec la convention d'appel, n'est-ce pas?
Fonction d'envoi: = cs_send (msg, msg_size)? – lakshmanaraj
Quelle ligne de code provoque l'exception AccessViolationException? –
Les AV sont causées par du code non géré. Votre fonction cpp_send(), très probablement. Code que vous n'avez pas publié. –