2010-07-27 9 views
2

Je travaille sur un moteur de débogage personnalisé et lorsque je marshal ma structure à un IntPtr se bloque Visual Studio (celui qui est débogué pas le débogueur).Marshal.StructureToPtr se bloque Visual Studio

Mon struct est un peu plus:

public struct DocumentContext : IDebugDocumentContext2, IDebugCodeContext2 
{ 
    private string _fileName; 

    //.....Implementation of interfaces 
} 

Mon code marshalling ressemble à ceci:

 var documentContext = new DocumentContext(_node.FileName); 
     var size = Marshal.SizeOf(documentContext); 
     IntPtr ptrDocContext = Marshal.AllocHGlobal(size); 
     //This is what is crashing 
     //I don't have a chance to catch anything, it just craps out 
     //Event log says faulting dll is nt.dll 
     Marshal.StructureToPtr(documentContext, ptrDocContext, true); 

Est-ce que je manque quelque chose?

Répondre

5

Vous ne devez pas utiliser deleteOld si la structure non gérée n'a jamais été allouée auparavant. deleteOld n'est applicable que lorsque vous écrasez une structure précédente (afin de libérer des références de chaîne, par exemple.) Cela devrait fonctionner:

Marshal.StructureToPtr(documentContext, ptrDocContext, false); 
+0

Ahhh qui a fonctionné. Merci. J'étais un peu flou sur ce drapeau. –

+1

L'avertissement dans la documentation est un peu subtil. Il indique clairement que vous pouvez perdre de la mémoire si vous passez false, mais seulement plus bas, cela clarifie-t-il que si la structure ne contient pas de données valides, le passage true échouera. Essentiellement, il essaie de libérer la mémoire pointée par la référence de chaîne dans la structure, mais le pointeur n'est pas valide et, voila, un crash. –

Questions connexes