मैं वीएस2017 (सी # में) के लिए एक विस्तार VSPackage बनाने की कोशिश कर रहा हूं जो बाइनरी डेटा को एक्सएमएल में परिवर्तित कर देगा, डिफ़ॉल्ट रूप से डिफ़ॉल्ट वीएस एक्सएमएल संपादक और एक्सएमएल भाषा सेवा में खुलता है, और फिर इसे सहेजने पर बाइनरी में बदल देता है।वीएसएक्स: एक्सएमएल में परिवर्तित बाइनरी फाइलों को संभालने के लिए मैं मौजूदा एक्सएमएल संपादक का पुन: उपयोग कैसे कर सकता हूं?
हालांकि, मुझे यह पता लगाने में परेशानी है कि इसके लिए कौन से कदमों की आवश्यकता होगी।
- बनाएं नया पाठ बफर
- परिवर्तित XML डेटा
- कोर संपादक बनाएं साथ यह फीड
- पाठ के साथ यह फ़ीड: मैं अब के लिए निम्नलिखित जब संपादक कारखाने में एक नए संपादक बनाने के बारे में सोचा बफ़र
अभी मेरा प्रयास इस तरह दिखता है:
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;
}
जब मैं अपने संपादक के साथ फ़ाइल को स्पष्ट रूप से खोलने का प्रयास करता हूं, तो यह "" चयनित संपादक के साथ फ़ाइल खोला नहीं जा सकता है। कृपया एक और संपादक चुनें। "संदेश मुझे समझ में नहीं आता है, मैंने XML संपादक के साथ XML डेटा खोलने का प्रयास किया है, लेकिन यह अभी भी बाइनरी डेटा के साथ एक टेक्स्ट एडिटर खोलने का प्रयास करता है।
मैं यहां फंस गया हूं, मैंने किया सब मैं के बारे में सोच सकता है यह डेटा परिवर्तित को खिलाने के लिए। जाहिर है इस तरह से सही नहीं है।
- मैं बाइनरी डेटा लाने के लिए, जल्दी से यह XML में बदलने का है, तो एक्सएमएल करने के लिए इसे फ़ीड inbetween चरणों कैसे जोड़ सकता है संपादक?
- एक्सएमएल संपादक फ़ाइल सहेजता है जब मैं इसे बाइनरी के रूप में वापस कैसे स्टोर करूं?
- क्या एक्सएमएल का पुन: उपयोग करना संभव है इसके लिए संपादक और भाषा सेवाएं?
मुझे खेद है कि इन प्रश्नों के लिए लंबे उत्तरों की आवश्यकता है; मैं पहले से ही खुश हूं अगर मैं सही दिशा में या कुछ पहले से ही खुले-सोर्स किए गए एक्सटेंशन को कुछ समान कर सकता हूं (इसे एक वीएस कोड संपादक में प्रदर्शित करने से पहले फ़ाइल डेटा परिवर्तित करना)।
सुनिश्चित नहीं हैं, लेकिन मैं एक अस्थायी निर्देशिका में एक xml फ़ाइल के रूप में सहेजने से उसके चारों ओर हैक संपादक में खोलें, और के लिए फ़ाइल को देखने चाहते हैं परिवर्तन। सुरुचिपूर्ण नहीं, लेकिन जल्दी से करने योग्य। हो सकता है कि कोई जानता है कि सुरुचिपूर्ण मार्ग कैसे काम कर रहा है ... – Will
हाँ, मैंने इसके बारे में सोचा कि वीएसएक्स द्वारा पीटा महसूस किया जा रहा है, लेकिन फिर मैं अपने मौजूदा बाहरी प्रोग्राम को फ़ाइलों को संशोधित करने के लिए रख सकता हूं; प्लस मुझे यकीन नहीं है कि उन हैक्स को अंततः कार्यान्वित करना आसान है ... –