VS2019添加LSP扩展编译通过但ILanguageClient子类未实例化问题求助
解决VS2019 16.11版本LSP扩展加载失败问题
问题根因
你遇到的是VS版本和依赖NuGet包版本不匹配导致的MEF导入失败:
- VS2019 16.11版本自带的
Microsoft.VisualStudio.LanguageServer.Client程序集对ILanguageClient接口做了新增,比16.10版本的NuGet包多了两个成员 - 用16.10版本包编译通过后,运行时VS的MEF组件会校验接口完整性,发现你的实现缺失成员,就会跳过导入,所以你的类不会被实例化,构造函数断点不触发
解决步骤
1. 补全接口缺失成员,修复签名匹配
不用升级到17.x版本的NuGet包,直接在你的BarLanguageClient类中添加两个缺失的接口实现即可:
// 新增1:初始化失败时是否弹出通知的属性 public bool ShowNotificationOnInitializeFailed => true; // 新增2:带初始化信息参数的失败回调方法 public Task OnServerInitializeFailedAsync(ILanguageClientInitializationInfo initializationInfo) { // 可按需添加错误日志逻辑 return Task.CompletedTask; }
添加后直接用16.10版本的NuGet包即可正常编译,且运行时接口签名和VS 16.11自带的程序集完全匹配。
2. (优先方案)直接引用本地VS自带的程序集
如果补全成员后仍有版本冲突,可以直接引用本地VS安装目录下的对应程序集,完全匹配当前版本:
- 找到VS2019安装路径下的
Common7\IDE\CommonExtensions\Microsoft\LanguageServer\Microsoft.VisualStudio.LanguageServer.Client.dll - 在项目中添加对该dll的引用
- 右键引用属性,将
复制本地和包含在VSIX中均设为False,避免打包重复的程序集引发冲突。
3. 校验VSIX清单配置
打开source.extension.vsixmanifest,确认安装目标版本范围限制为VS2019:
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[16.0,17.0)" />
避免扩展被安装到VS2022引发版本不兼容。
4. 排查MEF加载错误
如果完成以上操作后类仍未实例化,可查看实验实例的MEF错误日志定位问题:
- 日志路径:
%APPDATA%\Microsoft\VisualStudio\16.0_<随机后缀>\ComponentModelCache\Microsoft.VisualStudio.Default.err - 在日志中搜索你的类名
BarLanguageClient,即可看到具体的导入失败原因。
内容的提问来源于stack exchange,提问作者Harald Hoyer
相关产品推荐
相关产品推荐

