我正在尝试为visual studio创建我的第一个扩展程序,到目前为止,我一直在按照本教程开始(http://www.diaryofaninja.com/blog/2014/02/18/who-said-building-visual-studio-extensions-was-hard)。 现在,当我单击解决方案资源管理器中的文件时,我出现了一个自定义菜单项。 我现在需要的小项目是获取在解决方案资源管理器中选择的文件的路径,但我无法理解如何做到这一点。 有什么帮助吗?
----------------------------编辑------------------ ------------
正如matze所说,答案在我发布的链接中。我写这篇文章的时候并没有注意到它。 与此同时,我还在这个帖子中找到了另一个可能的答案:How to get the details of the selected item in solution explorer using vs package
我找到了这段代码:
foreach (UIHierarchyItem selItem in selectedItems)
{
ProjectItem prjItem = selItem.Object as ProjectItem;
string filePath = prjItem.Properties.Item("FullPath").Value.ToString();
//System.Windows.Forms.MessageBox.Show(selItem.Name + filePath);
return filePath;
}
所以,这里有两种获取所选文件路径的方法:)
答案 0 :(得分:2)
您提到的文章已经包含了解决方法。
在示例代码中查找menuCommand_BeforeQueryStatus
方法。它使用IsSingleProjectItemSelection
方法获取表示项目的IVsHierarchy
对象以及所选项的ID。您似乎可以安全地将层次结构转换为IVsProject
并使用其GetMkDocument
函数来查询项目的完整路径......
IVsHierarchy hierarchy = null;
uint itemid = VSConstants.VSITEMID_NIL;
if (IsSingleProjectItemSelection(out hierarchy, out itemid))
{
IVsProject project;
if ((project = hierarchy as IVsProject) != null)
{
string itemFullPath = null;
project.GetMkDocument(itemid, out itemFullPath);
}
}
我不想将文章中的整个代码复制到此答案中,但IsSingleProjectItemSelection
函数如何获取所选项目可能会很有意义;所以我只是添加一些注释,这可能会引导到正确的方向......该方法使用全局IVsMonitorSelection
服务的GetCurrentSelection
方法查询当前所选项目。
答案 1 :(得分:1)
供以后参考:
//In your async method load the DTE
var dte2 = await ServiceProvider.GetGlobalServiceAsync(typeof(SDTE)) as DTE2;
var selectedItems = dte2.SelectItems;
if(selectedItems.MultiSelect || selectedItems.Count > 1){ //Use either/or
for(short i = 1; i <= selectedItems.Count; i++){
//Get selected item
var selectedItem = selectedItems[i];
//Get associated project item (selectedItem.ProjectItem
//If selectedItem is a project, then selectedItem.ProjectItem will be null,
//and selectedItem.Project will not be null.
var projectItem = selectedItem.ProjectItem;
//Get project for ProjectItem
var project = projectItem.ContainingProject;
// Or get project object if selectedItem is a project
var sproject = selectedItem.Project;
//Is selectedItem a physical folder?
var isFolder = projectItem.Kind == EnvDTE.Constants.vsProjectItemKindPhysicalFolder;
//Else, get item's folder
var itemFolder = new FileInfo(projectItem.Properties.Item("FullPath").ToString()).Directory;
//Find config file
var configFiles itemFolder.GetFiles("web.config");
var configfile = configFiles.length > 0 ? configFiles[0] : null;
//Turn config file into ProjectItem object
var configItem = dte2.solution.FindProjectItem(configFile.FullName);
}
}
我希望有人觉得这有帮助...