簡體   English   中英

如何從VS 2017中的設置中獲取當前的Projects&Solutions目錄,並使用SDK加載解決方案?

[英]How can I get the current Projects & Solutions directory from the settings in VS 2017 and load solution using SDK?

我為VS 2017構建了自定義工具窗口擴展。除2件事外,其他所有東西都起作用:

我需要從工具/選項/項目和解決方案/位置中獲取“項目位置”。

我還需要告訴VS的當前實例以加載解決方案或項目。

我已經在VS SDK上搜索了幾天,但還沒有提出太多建議。 我已經走了這么遠:

ShellSettingsManager sm = new ShellSettingsManager();

但這需要兩個接口之一作為參數IVsSettingsManager或IServiceProvider。

我實現了接口,當然,它創建了方法,所有方法都用NotImplemented異常編碼。

因此,由於我在這里一無所知,所以希望有人能指出正確的方向,即使不是直接向我展示如何操作。

我終於想通了。 您可以為ShellSettingsManager的構造函數提供一個ServiceProvider。 我看過的所有示例都使用過:

SettingsManager sm = new ShellSettingsManager(ServiceProvider);

但是當我嘗試這樣做時,我得到“ ServiceProvider是一個類型,在給定的上下文中無效”

我終於找到一個使用以下示例:

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(string Command,string Args),但不知道那是否是我所需要的。 然后,我讀到一些說它執行“工具/選項/環境/鍵盤”部分中可用命令的內容。 我仔細閱讀了一下,發現“ File.OpenProject”,並認為我可以將解決方案文件作為參數發送。 但是,還有另一個問題...

添加對EnvDTE的引用並嘗試執行以下操作:

DTE.ExecuteCommand("File.OpenProject", "\"" + PathToSlnFile + "\"");

只是給我一個錯誤,說,

非靜態字段,方法或屬性'_DTE.ExecuteCommand(string,string)'需要對象引用

我嘗試實例化它

var dte = new DTE();

但這只是給了我一些無法讀取有關COM庫的運行時錯誤。 我發現了100萬個使用DTE.ExecuteCommand的示例,但是沒有一個示例顯示了如何獲得對DTE.ExecuteCommand的引用。 我確實在Google圖書“精通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 Extension方面一無所獲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM