我怎样才能获得当前的项目& VS 2017中的设置的解决方案目录和使用SDK的加载解决方案?

时间:2018-05-20 16:25:07

标签: c# visual-studio-2017 visual-studio-sdk

我为VS 2017构建了一个自定义工具窗口扩展。除了两件事之外,一切都有效:

我需要从工具/选项/项目和解决方案/位置获取“项目位置”。

我还需要告诉当前的VS实例加载解决方案或项目。

我一直在VS SDK上寻找好几天,但还是没能提出太多。我到目前为止:

ShellSettingsManager sm = new ShellSettingsManager();

但是它需要两个接口中的一个作为参数,IVsSettingsManager或IServiceProvider。

我实现了接口,当然,它创建了所有使用NotImplemented例外编码的方法。

所以,既然我在这里完全无能为力,我希望有人可以指出我正确的方向,如果不是直接告诉我该怎么做。

1 个答案:

答案 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);

作为参数的空字符串获取根集合属性,这就是我需要的。

screenshot of messagebox

所以现在我终于找到了我需要的价值。

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扩展程序的任何内容。