La validation des points d'arrêt (managed de package)
Un point d'arrêt indique que l'exécution du programme doit arrêter à un point particulier pendant qu'elle est exécutée dans un débogueur. Un utilisateur peut placer un point d'arrêt sur toute ligne du fichier source, car l'éditeur n'a aucune connaissance de ce qui constitue un emplacement valide pour un point d'arrêt. Lorsque le débogueur est lancé, tous les points d'arrêt marqués (appelés en attente des points d'arrêt) sont liés à l'emplacement approprié dans le programme en cours de exécution. En même temps les points d'arrêt sont validés pour vérifier qu'ils marquent des emplacements valides de code. Par exemple, un point d'arrêt sur un commentaire est pas valide, car il n'existe aucun code à cet emplacement dans le code source. Le débogueur désactive les points d'arrêt valides.
Étant donné que le service de langage sait code source affiché, il peut valider des points d'arrêt avant que le débogueur est lancé. Vous pouvez substituer la méthode d' ValidateBreakpointLocation pour retourner une étendue spécifiant un emplacement valide pour un point d'arrêt. L'emplacement du point d'arrêt est encore validées lorsque le débogueur est lancé, mais l'utilisateur est informé des points d'arrêt valides sans attendre que le débogueur pour charger.
Implémentant la prise en charge de valider des points d'arrêt
La méthode d' ValidateBreakpointLocation correspond à la position du point d'arrêt. Votre implémentation doit décider si l'emplacement est valide, et indiquer en retournant une étendue de texte qui identifie le code associé à la position de la ligne le point d'arrêt.
S_OK de retour si l'emplacement est valide, ou S_FALSE s'il n'est pas valide.
si le point d'arrêt est valide l'étendue de texte est mise en surbrillance avec le point d'arrêt.
Si le point d'arrêt est valide, un message d'erreur s'affiche dans la barre d'état.
Exemple
Cet exemple montre une implémentation de la méthode d' ValidateBreakpointLocation qui appelle l'analyseur pour obtenir l'étendue de code (le cas échéant) à l'emplacement spécifié.
Cet exemple suppose que vous avez ajouté une méthode d' GetCodeSpan à la classe d' AuthoringSink qui valide l'étendue de texte et retourne true s'il s'agit de l'emplacement d'un point d'arrêt non valide.
using Microsoft VisualStudio;
using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;
namespace TestLanguagePackage
{
class TestLanguageService : LanguageService
{
public override int ValidateBreakpointLocation(IVsTextBuffer buffer,
int line,
int col,
TextSpan[] pCodeSpan)
{
int retval = VSConstants.S_FALSE;
if (pCodeSpan != null)
{
// Initialize span to current line by default.
pCodeSpan[0].iStartLine = line;
pCodeSpan[0].iStartIndex = col;
pCodeSpan[0].iEndLine = line;
pCodeSpan[0].iEndIndex = col;
}
if (buffer != null)
{
IVsTextLines textLines = buffer as IVsTextLines;
if (textLines != null)
{
Source src = this.GetSource(textLines);
if (src != null)
{
TokenInfo tokenInfo = new TokenInfo();
string text = src.GetText();
ParseRequest req = CreateParseRequest(src,
line,
col,
tokenInfo,
text,
src.GetFilePath(),
ParseReason.CodeSpan,
null);
req.Scope = this.ParseSource(req);
TestAuthoringSink sink = req.Sink as TestAuthoringSink;
TextSpan span = new TextSpan();
if (sink.GetCodeSpan(out span))
{
pCodeSpan[0] = span;
retval = VSConstants.S_OK;
}
}
}
}
return retval;
}
}
}