2009-03-06 5 views
0

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?

+0

Fonction d'envoi: = cs_send (msg, msg_size)? – lakshmanaraj

+0

Quelle ligne de code provoque l'exception AccessViolationException? –

+0

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é. –

Répondre

0

Qu'est-ce que 'data.Length'? S'il vous plaît fournir la définition lorsque les données sont déclarées. MISE À JOUR: Il peut également s'agir du rappel (délégué) que vous passez dans la fonction à l'aide de stdcall, alors que la fonction non managée attend une convention d'appel cdecl.

1

Vous envoyez 5 paramètres à une fonction qui n'en reçoit que 3?

Modifier: Merci d'avoir corrigé le code. Vous dites que cela échoue avec certains types de données. Pouvez-vous dire quel type?

+0

cela dépend du nombre de messages que j'essaie d'envoyer, il se bloque avec environ 100000, mais fonctionne très bien pour tous les messages ci-dessous. –

+0

Peut-être que le processus C++ ne peut pas allouer un pointeur pour autant de quantité de données? Cela a-t-il fonctionné tout seul? – gbianchi