Utilisation de RDT_ReadLock
_VSRDTFLAGS.RDT_ReadLock est un indicateur qui fournit une logique de verrouillage d’un document dans la table de documents en cours d’exécution (RDT), qui est la liste de tous les documents actuellement ouverts dans l’IDE Visual Studio. Cet indicateur détermine quand des documents sont ouverts et si un document est visible dans l’interface utilisateur ou conservé de manière invisible en mémoire.
En règle générale, vous utilisez _VSRDTFLAGS.RDT_ReadLock dans l’un des cas suivants :
Vous souhaitez ouvrir un document de manière invisible et en lecture seule, mais il n’est pas encore établi quel IVsHierarchy doit le posséder.
Vous souhaitez que l’utilisateur soit invité à enregistrer un document qui a été ouvert de manière invisible avant que l’utilisateur l’ait affiché dans l’IU puis tenté de le fermer.
Comment gérer les documents visibles et invisibles
Lorsqu’un utilisateur ouvre un document dans l’IU, un propriétaire IVsHierarchy du document doit être établi et un indicateur _VSRDTFLAGS.RDT_EditLock doit être défini. Si aucun propriétaire IVsHierarchy ne peut être établi, le document ne sera pas enregistré lorsque l’utilisateur clique sur Enregistrer tout ou ferme l’IDE. Cela signifie que si un document est ouvert de manière invisible où il est modifié en mémoire, et que l’utilisateur est invité à enregistrer le document lors de l’arrêt ou s’il est enregistré quand Enregistrer tout est choisi, alors un RDT_ReadLock
ne peut pas être utilisé. Au lieu de cela, vous devez utiliser un RDT_EditLock
et enregistrer un IVsDocumentLockHolder avec un indicateur __VSREGDOCLOCKHOLDER.RDLH_WeakLockHolder.
RDT_EditLock et modification de document
L’indicateur précédent mentionné indique que l’ouverture invisible du document génère son RDT_EditLock
lorsque le document est ouvert par l’utilisateur dans une DocumentWindow visible. Lorsque cela se produit, l’utilisateur reçoit une invite Enregistrer lorsque la DocumentWindow visible est fermée. Les implémentations de Microsoft.VisualStudio.Package.Automation.OAProject.CodeModel
qui utilisent le service IVsInvisibleEditorManager fonctionnent initialement lorsqu’un RDT_ReadLock
est pris (c’est-à-dire lorsque le document est ouvert de manière invisible pour analyser les informations). Plus tard, si le document doit être modifié, le verrou est mis à niveau vers un RDT_EditLock faible. Si l’utilisateur ouvre ensuite le document dans une DocumentWindow visible, le RDT_EditLock
faible de CodeModel
est libéré.
Si l’utilisateur ferme ensuite la DocumentWindow et choisit Non lorsqu’il est invité à enregistrer le document ouvert, l’implémentation de CodeModel
supprime toutes les informations du document et rouvrira le document à partir du disque de manière invisible la prochaine fois que d’autres informations seront requises pour le document. La subtilité de ce comportement est une instance où l’utilisateur ouvre la DocumentWindow du document ouvert de manière invisible, le modifie, le ferme, puis choisit Non quand il est invité à enregistrer le document. Dans ce cas, si le document a un RDT_ReadLock
, il ne sera pas réellement fermé et le document modifié restera ouvert de manière invisible en mémoire, même si l’utilisateur a choisi de ne pas enregistrer le document.
Si l’ouverture invisible du document utilise un RDT_EditLock
faible, elle génère son verrou lorsque l’utilisateur ouvre le document de manière visible et qu’aucun autre verrou n’est conservé. Lorsque l’utilisateur ferme la DocumentWindow et choisit Non lorsqu’il est invité à enregistrer le document, le document doit être fermé dans la mémoire. Cela signifie que le client invisible doit écouter les événements RDT pour suivre cette occurrence. La prochaine fois que le document est requis, le document doit être rouvert.