如何通过C#获取CurrentSetting.vssettings路径及VS版本目录
我来帮你解决这个问题,针对获取Visual Studio CurrentSettings.vssettings 文件路径的需求,这里有几种可靠的C#实现方法,根据你的场景选择即可:
方法一:通过Visual Studio DTE对象(适用于VS扩展开发)
如果你是在开发Visual Studio扩展(比如VSIX插件),直接利用DTE对象就能一步拿到完整的设置文件路径,完全不需要自己拼接版本标识:
using EnvDTE; using System.Runtime.InteropServices; // 获取当前活跃的VS实例DTE对象 DTE dte = (DTE)Marshal.GetActiveObject("VisualStudio.DTE.16.0"); // 直接拿到CurrentSettings.vssettings的完整路径 string settingsFilePath = dte.Settings.UserSettingsFile;
这个方法的优势是最准确,因为DTE直接提供了用户设置文件的绝对路径,不需要关心版本标识的细节。
方法二:通过注册表查询(适用于外部独立程序)
Visual Studio会把所有实例的信息存在注册表中,我们可以通过遍历注册表项来匹配版本,找到对应的实例标识(比如16.0_1905b589),进而构造设置目录:
using Microsoft.Win32; using System.IO; public static string GetVsSettingsDirectory(string targetAssemblyVersion) { // 拆分目标版本,只匹配主版本和次版本(比如16.6) string[] versionParts = targetAssemblyVersion.Split('.'); string targetMajorMinor = $"{versionParts[0]}.{versionParts[1]}"; string instancesRegPath = @"Software\Microsoft\VisualStudio\Setup\Instances"; using (RegistryKey instancesKey = Registry.CurrentUser.OpenSubKey(instancesRegPath)) { if (instancesKey == null) return null; foreach (string instanceId in instancesKey.GetSubKeyNames()) { using (RegistryKey instanceKey = instancesKey.OpenSubKey(instanceId)) { string productVersion = instanceKey.GetValue("ProductVersion") as string; // 匹配主版本和次版本,忽略后续版本号差异 if (productVersion != null && productVersion.StartsWith(targetMajorMinor)) { string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); return Path.Combine(localAppData, @"Microsoft\VisualStudio", instanceId, "Settings"); } } } } return null; } // 使用示例:传入你获取到的16.6.0.38 string settingsDir = GetVsSettingsDirectory("16.6.0.38"); if (!string.IsNullOrEmpty(settingsDir)) { string fullSettingsPath = Path.Combine(settingsDir, "CurrentSettings.vssettings"); // 这里可以处理你的设置文件了 }
方法三:使用Visual Studio Setup API(最可靠的外部程序方案)
如果担心注册表结构变化,官方提供的Setup API是更稳定的选择。你需要先通过NuGet安装Microsoft.VisualStudio.Setup.Configuration.Native包,然后用以下代码:
using Microsoft.VisualStudio.Setup.Configuration; using System; using System.IO; using System.Runtime.InteropServices; public static string GetVsSettingsDirectoryBySetupApi(string targetAssemblyVersion) { string[] versionParts = targetAssemblyVersion.Split('.'); string targetMajorMinor = $"{versionParts[0]}.{versionParts[1]}"; ISetupConfiguration setupConfig = new SetupConfiguration(); IEnumSetupInstances enumInstances = setupConfig.EnumInstances(); ISetupInstance[] instances = new ISetupInstance[1]; uint fetched; while (enumInstances.Next(1, instances, out fetched) == 0 && fetched > 0) { if (instances[0] is ISetupInstance2 instance) { string installationVersion = instance.GetInstallationVersion(); if (installationVersion.StartsWith(targetMajorMinor)) { string instanceId = instance.GetInstanceId(); string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); return Path.Combine(localAppData, @"Microsoft\VisualStudio", instanceId, "Settings"); } } } return null; } // 使用示例 string settingsDir = GetVsSettingsDirectoryBySetupApi("16.6.0.38");
版本匹配说明
你通过GetAssembly获取到的16.6.0.38是VS程序集的版本,而VS实例的发布版本(比如16.6.30320.25)会更详细,所以我们只需要匹配主版本(16)和次版本(6)就能找到对应的实例,不需要完全一致。
内容的提问来源于stack exchange,提问作者Нормандия Лис
相关产品推荐
相关产品推荐

