咨询Codingame.com的Monaco C#语言服务实现及Web项目IntelliSense配置
虽然Codingame没有公开其具体实现细节,但结合OmniSharp的特性和在线IDE的通用方案,大致可以从以下几个方向入手解决Web环境下C# IntelliSense的问题:
虚拟文件系统适配
OmniSharp并非必须依赖物理文件,它允许通过实现IFileSystem接口来提供虚拟文件系统支持。你可以在后端创建内存中的虚拟目录结构,动态生成包含用户代码的虚拟.cs文件,以及极简的.csproj/.sln项目文件(用来定义编译依赖、目标框架等),将这些虚拟资源注入OmniSharp的上下文,让它以为是在处理真实项目。后端服务化OmniSharp实例
将OmniSharp封装成后端服务,为每个用户会话维护独立的虚拟文件上下文(或通过命名空间/会话ID隔离复用实例)。前端Monaco编辑器在代码变更时,通过WebSocket或HTTP请求将最新代码同步到后端,后端更新对应会话的虚拟文件,OmniSharp基于这些虚拟内容完成代码分析,再将IntelliSense结果(补全列表、语法诊断、跳转定义等)返回给前端,注入Monaco的语言服务。Monaco与OmniSharp的LSP对接
OmniSharp支持语言服务器协议(LSP),你可以在前端使用Monaco的LSP客户端,将编辑器的操作(比如触发补全、悬停查询)转换成标准LSP请求,发送到后端的OmniSharp服务,再将服务返回的LSP响应解析后渲染到Monaco中。这种方式不需要直接处理OmniSharp的内部API,适配成本更低。
内容的提问来源于stack exchange,提问作者Holzmichlnator

