如何在 VSIX 扩展中找到打开的文件夹
How do I find the open folder in a VSIX extension
我想编写一个 VSIX LSP 扩展。我希望它以最简单的方式工作 - 这似乎是使用 "Open Folder" 功能打开一个代码文件夹,然后做我的事情。
要启动LSP 服务器,我需要知道打开文件夹的目录。我如何知道 Visual Studio 是否处于 "open folder" 模式(如果不是,则 LSP 不应启动),以及我如何知道该文件夹的路径(以便我可以启动 LSP 服务器)?
我发现 https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.interop.ivssolutionevents7?view=visualstudiosdk-2017 这似乎很有希望,因为我可以在某些 特定 文件夹打开时注册 - 一个告诉我 "open folder" 的事件已使用的功能可能是完美的 - 如果打开文件夹,则启动该文件夹的 LSP。
以下代码将为您获取 3 条信息:
// get solution reference from a service provider (package, etc.)
var solution = (IVsSolution)ServiceProvider.GetService(typeof(SVsSolution));
solution.GetSolutionInfo(out string dir, out string file, out string ops);
// dir will contain the solution's directory path (folder in the open folder case)
solution.GetProperty((int)__VSPROPID.VSPROPID_IsSolutionOpen, out object open);
bool isOpen = (bool)open; // is the solution open?
// __VSPROPID7 needs Microsoft.VisualStudio.Shell.Interop.15.0.DesignTime.dll
solution.GetProperty((int)__VSPROPID7.VSPROPID_IsInOpenFolderMode, out object folderMode);
bool isInFolderMode = (bool)folderMode; // is the solution in folder mode?
我想编写一个 VSIX LSP 扩展。我希望它以最简单的方式工作 - 这似乎是使用 "Open Folder" 功能打开一个代码文件夹,然后做我的事情。
要启动LSP 服务器,我需要知道打开文件夹的目录。我如何知道 Visual Studio 是否处于 "open folder" 模式(如果不是,则 LSP 不应启动),以及我如何知道该文件夹的路径(以便我可以启动 LSP 服务器)?
我发现 https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.shell.interop.ivssolutionevents7?view=visualstudiosdk-2017 这似乎很有希望,因为我可以在某些 特定 文件夹打开时注册 - 一个告诉我 "open folder" 的事件已使用的功能可能是完美的 - 如果打开文件夹,则启动该文件夹的 LSP。
以下代码将为您获取 3 条信息:
// get solution reference from a service provider (package, etc.)
var solution = (IVsSolution)ServiceProvider.GetService(typeof(SVsSolution));
solution.GetSolutionInfo(out string dir, out string file, out string ops);
// dir will contain the solution's directory path (folder in the open folder case)
solution.GetProperty((int)__VSPROPID.VSPROPID_IsSolutionOpen, out object open);
bool isOpen = (bool)open; // is the solution open?
// __VSPROPID7 needs Microsoft.VisualStudio.Shell.Interop.15.0.DesignTime.dll
solution.GetProperty((int)__VSPROPID7.VSPROPID_IsInOpenFolderMode, out object folderMode);
bool isInFolderMode = (bool)folderMode; // is the solution in folder mode?