바이너리 데이터를 XML로 변환하고 기본 VS XML 편집기 및 XML 언어 서비스에서 열어 저장 한 다음 다시 이진 데이터로 변환하는 VS2017 (C#에서) 용 확장 VSPackage를 만들려고합니다.VSX : XML로 변환 된 바이너리 파일을 처리하기 위해 기존 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로 변환 한 다음 XML로 먹이를 inbetween 단계를 추가 할 수 있습니다 편집기?
- XML 편집기가 파일을 저장할 때 어떻게 다시 이진 파일로 저장하겠습니까?
- XML을 다시 사용할 수 있습니까? 편집자 및 언어 서비스
이러한 질문에 긴 답변이 필요하면 죄송합니다. 나는 옳은 방향으로 또는 이미 오픈 소스 확장이 가리키는 것을 얻을 수 있다면 비슷한 일을 할 수있다. (VS 코드 편집기에서 파일 데이터를 표시하기 전에 파일 데이터를 변환하는 것).
잘 모르겠지만 임시 디렉토리에 xml 파일로 저장하여 파일을 열어서 파일을보고 변경. 우아하지는 않지만 신속하게 할 수 있습니다. 어쩌면 누군가 우아한 경로를 작동시키는 방법을 알고있을 것입니다 ... – Will
그래, VSX로 구타당한 느낌에 대해서도 생각했지만 파일을 수정하기 위해 현재의 외부 프로그램을 유지할 수 있습니다. 게다가 그 해킹이 결국 구현하기가 쉽지 않은지 ... –