我已经创建了IVsInvisibleEditor的一个实例。我用下面的代码来实现这一目标:句法突出显示不适用于IVsInvisibleEditor
public IWpfTextViewHost CreateEditor(string targetFile)
{
var componentModel = (IComponentModel)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel));
var editorAdapter = componentModel.GetService<IVsEditorAdaptersFactoryService>();
var editorFactoryService = componentModel.GetService<ITextEditorFactoryService>();
var invisibleEditorManager = (IVsInvisibleEditorManager)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsInvisibleEditorManager));
IVsInvisibleEditor invisibleEditor;
ErrorHandler.ThrowOnFailure(invisibleEditorManager.RegisterInvisibleEditor(
targetFile,
pProject: null,
dwFlags: (uint)_EDITORREGFLAGS.RIEF_ENABLECACHING,
pFactory: null,
ppEditor: out invisibleEditor));
var docDataPointer = IntPtr.Zero;
Guid guidIVsTextLines = typeof(IVsTextLines).GUID;
ErrorHandler.ThrowOnFailure(invisibleEditor.GetDocData(
fEnsureWritable: 1,
riid: ref guidIVsTextLines,
ppDocData: out docDataPointer));
//Create a code window adapter
IVsTextLines docData = (IVsTextLines)Marshal.GetObjectForIUnknown(docDataPointer);
var codeWindow = editorAdapter.CreateVsCodeWindowAdapter(VisualStudioServices.OLEServiceProvider);
ErrorHandler.ThrowOnFailure(codeWindow.SetBuffer(docData));
IVsTextView textView;
ErrorHandler.ThrowOnFailure(codeWindow.GetPrimaryView(out textView));
var userData = (IVsUserData)codeWindow;
var uniqueMoniker = Guid.NewGuid().ToString();
Guid bufferMonikerGuid = typeof(IVsUserData).GUID;
userData.SetData(ref bufferMonikerGuid, uniqueMoniker);
var guid = VSConstants.VsTextBufferUserDataGuid.VsTextViewRoles_guid;
userData.SetData(ref guid, editorFactoryService.CreateTextViewRoleSet(editorFactoryService.DefaultRoles).ToString());
var host = editorAdapter.GetWpfTextViewHost(textView);
host.TextView.Options.SetOptionValue(DefaultTextViewHostOptions.ZoomControlId, false);
return host;
}
它所有的作品,除了没有语法高亮如果,例如,我使用C#(的.cs)文件,以无形的编辑器中显示。经过一番研究,我发现,我也需要一个文档添加到RDT,我用下面的函数做的:现在
uint RegisterDocument(string targetFile)
{
//Then when creating the IVsInvisibleEditor, find and lock the document
uint itemID;
IntPtr docData;
uint docCookie;
IVsHierarchy hierarchy;
var runningDocTable = (IVsRunningDocumentTable)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SVsRunningDocumentTable));
var result = runningDocTable.FindAndLockDocument(
dwRDTLockType: (uint)_VSRDTFLAGS.RDT_EditLock,
pszMkDocument: targetFile,
ppHier: out hierarchy,
pitemid: out itemID,
ppunkDocData: out docData,
pdwCookie: out docCookie);
return docCookie;
}
,如果我显示C#文件,然后突出显示(也智能感知作品),但如果我例如显示一个SQL文件,那么我再次没有语法突出显示。现在,我调查得远一点,意识到也许我应该在一个文档附加语言服务,所以我用这个代码来实现这一目标:
Guid sqlGuid = LanguageServices.Guids.TSQL;
docData.SetLanguageServiceID(ref sqlGuid);
,瞧,它的工作原理,现在语法高亮也在努力上的SQL文件,但现在我有另一个问题,多视图上的SQL文件将无法正常工作。例如,如果我有一个文件MyQuery.sql,并用不可见的编辑器打开它,它将被打开,语法将显示并且一切按预期工作,但现在,如果我尝试打开相同的文件(而不可见编辑器是仍处于打开状态),然后我得到了以下信息:
我相信使用SQL文件时的东西与RDT也不行,看来,当没有附加的语言服务,然后添加到RDT以某种方式忽略,这很奇怪,因为相同的代码适用于C#文件。有没有其他的方式来打开特定的文件(可以是任何类型)使用不可见的编辑器,我错过了什么?