Je suis en train de créer une VSPackage d'extension pour VS2017 (en C#) qui convertir des données binaires en XML, ouvre que dans le défaut VS éditeur XML et un service de langage XML, et convertit ensuite en arrière en binaire lors de l'enregistrement.VSX: Comment puis-je réutiliser l'éditeur XML existant pour gérer les fichiers binaires convertis en XML?
Cependant, j'ai du mal à la ligne quelles mesures seraient nécessaires pour cela. Je pensais à ce qui suit pour l'instant lors de la création d'un nouvel éditeur dans l'usine de l'éditeur:
- Créer un nouveau tampon texte
- Nourrissez avec des données XML converties
- Créer éditeur de base
- Nourrissez avec le texte tampon
En ce moment, ma tentative ressemble à ceci:
private MyPackage _package; // Filled via constructor
private IServiceProvider _serviceProvider; // Filled via SetSite
public int CreateEditorInstance(uint grfCreateDoc, string pszMkDocument, string pszPhysicalView,
IVsHierarchy pvHier, uint itemid, IntPtr punkDocDataExisting, out IntPtr ppunkDocView,
out IntPtr ppunkDocData, out string pbstrEditorCaption, out Guid pguidCmdUI, out int pgrfCDW)
{
// Initialize and validate parameters.
ppunkDocView = IntPtr.Zero;
ppunkDocData = IntPtr.Zero;
pbstrEditorCaption = String.Empty;
pguidCmdUI = Guid.Empty;
pgrfCDW = 0;
VSConstants.CEF createDocFlags = (VSConstants.CEF)grfCreateDoc;
if (!createDocFlags.HasFlag(VSConstants.CEF.OpenFile) && !createDocFlags.HasFlag(VSConstants.CEF.Silent))
return VSConstants.E_INVALIDARG;
if (punkDocDataExisting != IntPtr.Zero)
return VSConstants.VS_E_INCOMPATIBLEDOCDATA;
// Create a sited IVsTextBuffer storing the converted data with the XML data and language service set.
IVsTextLines textLines = _package.CreateComInstance<VsTextBufferClass, IVsTextLines>();
SiteObject(textLines);
string xmlText = BinaryXmlData.GetXmlString(pszMkDocument);
textLines.InitializeContent(xmlText, xmlText.Length);
ErrorHandler.ThrowOnFailure(textLines.SetLanguageServiceID(ref Guids.XmlLanguageServiceGuid));
// Instantiate a sited IVsCodeWindow and feed it with the text buffer.
IVsCodeWindow codeWindow = _package.CreateComInstance<VsCodeWindowClass, IVsCodeWindow>();
SiteObject(codeWindow);
codeWindow.SetBuffer(textLines);
// Return the created instances to the caller.
ppunkDocView = Marshal.GetIUnknownForObject(codeWindow);
ppunkDocData = Marshal.GetIUnknownForObject(textLines);
return VSConstants.S_OK;
}
private void SiteObject(object obj)
{
(obj as IObjectWithSite)?.SetSite(_serviceProvider);
}
// --- CreateComInstance is a method on my package ----
internal TInterface CreateComInstance<TClass, TInterface>()
{
Guid guidT = typeof(TClass).GUID;
Guid guidInterface = typeof(TInterface).GUID;
TInterface instance = (TInterface)CreateInstance(ref guidT, ref guidInterface, typeof(TInterface));
if (instance == null)
throw new COMException($"Could not instantiate {typeof(TClass).Name}/{typeof(TInterface).Name}.");
return instance;
}
Lorsque j'essaie d'ouvrir explicitement un fichier avec mon éditeur, il indique "Le fichier ne peut pas être ouvert avec l'éditeur sélectionné. S'il vous plaît choisir un autre éditeur. "Le message n'a pas de sens pour moi, j'ai essayé d'ouvrir les données XML avec l'éditeur XML, mais il essaie toujours d'ouvrir un éditeur de texte avec les données binaires. tout ce que je pouvais penser pour l'alimenter converti les données. il semble que cette façon est pas la bonne.
- Comment pourrais-je ajouter des étapes inbetween pour récupérer les données binaires, convertir rapidement en XML, puis alimenter le XML éditeur
- Comment est-ce que je le stockerais comme binaire quand l'éditeur XML enregistre le fichier?
- Est-il possible de réutiliser le XML? éditeur et services linguistiques pour cela?
Je suis désolé si ces questions nécessitent des réponses longues; Je serais déjà heureux si je pouvais être pointé dans la bonne direction ou à une extension déjà ouverte de manière similaire (en convertissant les données du fichier avant de les afficher dans un éditeur de code VS).
Je ne sais pas, mais je vous pirater autour d'elle en l'enregistrant sous forme de fichier XML dans un répertoire temporaire, ouvrez-le dans l'éditeur, et regarder le fichier pour changements. Pas élégant, mais faisable rapidement. Peut-être que quelqu'un sait comment faire fonctionner l'itinéraire élégant ... – Will
Ouais, j'ai pensé à ça aussi me sentir battu par VSX, mais ensuite je peux garder mon programme externe actuel pour modifier les fichiers; de plus je ne suis pas sûr que ces hacks soient plus faciles à mettre en place par la suite ... –