2010-12-14 100 views
0

Je travaille sur la mise à jour de l'interface graphique d'une application native (MFC) en utilisant .NET et WPF. L'application collecte les données en temps réel et l'interface graphique est supposée visualiser ces données (en temps réel). Le plan global consiste à utiliser C++/CLI comme couche d'interopérabilité entre l'application native et la partie GUI gérée.Comment utiliser ce tableau natif dans ma classe .NET?

J'ai une classe native avec des tableaux d'octets contenant un "en-tête" donnant la longueur du tableau et le type des éléments qu'il contient. J'essaie d'écrire une couche d'interopérabilité en C++/CLI entre cette classe native et une classe .NET gérée.

Je souhaite utiliser la matrice d'octets non gérés dans la partie gérée de l'application. Je suis un peu débordé d'informations sur divers blogs et centres de documentation. C'est le contour de ce que j'ai jusqu'ici, ça fonctionne mais ça bloque parfois *. Je ne suis pas sûr si c'est la solution la plus appropriée, ou même comment l'implémenter correctement. Je voudrais savoir s'il existe une approche plus appropriée?

// Fetch numbers from the native class into unmanaged memory. 
IntPtr ipNumbers = InteropServices::Marshal::AllocHGlobal(sizeof(int) * arrayLength)) 
nativeClass->fetchNumbers((int *) ipNumbers.ToPointer(), arrayLength); 

// Copy data from unmanaged memory into a managed array. 
cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength); 
InteropServices::Marshal::Copy(ipNumbers, numbers, 0, arrayLength); 
InteropServices::Marshal::FreeHGlobal(ipNumbers); 

*) un message accident. « Windows a déclenché un point d'arrêt dans MyProgram.exe Cela peut être dû à une corruption du tas, ce qui indique un bogue dans MyProgram.exe ou l'une des DLL qu'il a chargé . [...] ". De ce que je peux dire c'est FreeHGlobal qui provoque le crash.

+0

Votre code semble bon, je ne sais pas pourquoi cela causerait un plantage sans voir plus de votre code. Vous pouvez éviter d'allouer la mémoire non managée en utilisant un pin_ptr dans le tableau numbers et passer directement à fetchNumbers. –

+0

J'ai changé le code pour utiliser un pin_ptr de nombres à la place et cela semble fonctionner. (Je vais mettre à jour mon message avec le code.) :-D Je suppose que la seule chose que je dois savoir, c'est si c'est la meilleure approche. –

Répondre

0

Prise en compte de la suggestion de Mattias J'ai changé le code, et cela fonctionne maintenant.

cli::array<int, 1> ^numbers = gcnew cli::array<int, 1>(arrayLength); 
pin_ptr<int> pp = &numbers[0]; 
nativeClass->fetchNumbers(pp, arrayLength);