如何访问VSIX中的内置语言服务



我在访问IVsExpansionClient.FormatSpan(IVsTextLines pBuffer, TextSpan[] ts)中的默认C#-LanguageService时遇到问题。我需要当前LanguageServiceSource-实例,以便能够为传入的Span创建EditArray。我能够接收到一个COM对象,代码如下:

pBuffer.GetLanguageServiceID(out var languageServiceId);
var provider = Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider;
var vssp = provider.GetService(typeof(IOleServiceProvider)) as IOleServiceProvider;
var iunknown = new Guid(VSConstants.IID_IUnknown.ToString());
IntPtr ptr;
if (ErrorHandler.Succeeded(vssp.QueryService(ref languageServiceId, ref iunknown, out ptr)))
{
try
{
service = Marshal.GetObjectForIUnknown(ptr);
lang = (LanguageService)service;
}
finally
{
Marshal.Release(ptr);
}
}

但铸造lang = (LanguageService)service;失败。我不知道service背后的COM对象是什么类型。所以我的问题是,如何获得当前开放编辑器的LanguageService?

我从这里获取了部分代码:https://github.com/microsoft/VSSDK-Extensibility-Samples/blob/346f5b0289e5fb8de639ba96fb10703df06cd22d/WPFDesigner_XML/WPFDesigner_XML/ViewModel.cs#L275

谢谢!

语言服务实现了许多不同的接口,然后您将尝试查询它以获得您想要的任何接口。你提到了C#,在我们的例子中,我们实际上根本不是从包框架LanguageService派生的,所以强制转换会失败。

你可能想在你的问题中澄清你试图实现的目标,因为我并不完全清楚

最新更新