我为VS 2017构建了一个自定义工具窗口扩展。除了两件事之外,一切都有效:
我需要从工具/选项/项目和解决方案/位置获取“项目位置”。
我还需要告诉当前的VS实例加载解决方案或项目。
我一直在VS SDK上寻找好几天,但还是没能提出太多。我到目前为止:
ShellSettingsManager sm = new ShellSettingsManager();
但是它需要两个接口中的一个作为参数,IVsSettingsManager或IServiceProvider。
我实现了接口,当然,它创建了所有使用NotImplemented例外编码的方法。
所以,既然我在这里完全无能为力,我希望有人可以指出我正确的方向,如果不是直接告诉我该怎么做。
答案 0 :(得分:1)
我终于弄明白了。您可以为ShellSettingsManager的构造函数提供ServiceProvider。我刚才看到的所有例子都是:
SettingsManager sm = new ShellSettingsManager(ServiceProvider);
但是当我尝试这个时,我得到了#34; ServiceProvider是一种类型,在给定的上下文中无效#34;
我终于找到了一个使用的例子:
SettingsManager sm = new ShellSettingsManager(ServiceProvider.GlobalProvider);
同样的例子继续......
SettingsStore ss = sm.GetReadOnlySettingsStore(SettingsScope.UserSettings);
这是我必须为自己找出休息的地方。
SettingsStore,GetPropertyNames和GetSubCollectionNames中有两个枚举。这些有助于找到我需要的集合和属性。所以首先我这样做了:
string msg = "";
foreach (string s in ss.GetPropertyNames(""))
{
msg += s + "\r\n";
}
MessageBox.Show(msg);
作为参数的空字符串获取根集合属性,这就是我需要的。
所以现在我终于找到了我需要的价值。
string DefaultNewProjectLocation = Environment.ExpandEnvironmentVariables(ss.GetString("", "DefaultNewProjectLocation"));
第一个参数,空字符串,是根集合,第二个参数是我想要的属性。它回来了:
%USERPROFILE%\source\repos
扩展环境变量为我提供了文字路径。
现在开始弄清楚如何让VS的当前实例加载我在工具窗口中选择的项目。
编辑:经过另一整天的搜索,最后让Visual Studio在我的扩展程序运行的实例中加载项目。有几个人告诉我使用Process.Start并将路径传递给解决方案文件但是这启动了另一个Visual Studio实例并将其加载到那里。
我找到了DTE.ExecuteCommand(字符串命令,字符串Args),但我不知道这是否是我需要的。然后我读了一些说它执行Tools / Options / Environment / Keyboard部分中可用命令的内容。我在那里仔细阅读并找到了#34; File.OpenProject"并认为我可以发送解决方案文件作为参数。但是还有一个问题......
添加对EnvDTE的引用并尝试此操作:
DTE.ExecuteCommand("File.OpenProject", "\"" + PathToSlnFile + "\"");
刚刚给我一个错误说,
非静态字段,方法或者需要对象引用 Property' _DTE.ExecuteCommand(string,string)'
我尝试过实例化
var dte = new DTE();
但是这只是给了我一些关于无法阅读有关COM库的内容的运行时错误。我找到了一百万个使用DTE.ExecuteCommand的例子,但其中没有一个展示了如何获取它的引用。我确实在谷歌图书中发现了这一点,并且#34;掌握Visual Studio .NET:充分利用Visual Studio .NET环境"
获取DTE对象引用的方式取决于 你正在写什么类型的代码。宏只使用全局 变量由称为DTE的宏环境提供。加载项是 当VS.NET初始化它们时,它传递了对该对象的引用。
好的,那仍然没有告诉我任何事情。我如何获得该参考?!?
然后我很幸运。我终于偶然发现了一个随机页面(我将它链接起来,但我已经把它关闭了,不要以为我再也找不到它了)。它给了我所需要的东西。
private DTE dte = Package.GetGlobalService(typeof(DTE)) as DTE;
而现在,我可以做到这一点,而且它很有效!
dte.ExecuteCommand("File.OpenProject", "\"" + PathToSolutionFile + "\"");
希望这样可以节省其他一些像我一样的穷人,他们花了整整三天时间搜索并找不到他们想要编写Visual Studio扩展程序的任何内容。