简体   繁体   English

Vsix(Visual Studio扩展)右键单击文件的完整路径

[英]Vsix (Visual Studio extension) full path of right-clicked file

I would like to retrieve the full path of a right-clicked file (within the editor of Visual Studio 2017). 我想检索一个右键单击文件的完整路径(在Visual Studio 2017的编辑器内)。 I already implemented the following code to retrieve the path of a file when a project and/or solution is opened. 在打开项目和/或解决方案时,我已经实现了以下代码来检索文件的路径。

This implementation isn't working if a single file is opened. 如果打开单个文件,则此实现不起作用。

Scenario: 场景:

  1. Open VS (2017) 开放VS(2017)
  2. Navigate to File -> Open -> File. 导航到文件->打开->文件。
  3. Right click on a file and click on the desired context menu. 右键单击文件,然后单击所需的上下文菜单。 (It calls the IsSingleProjectItemSelection method). (它调用IsSingleProjectItemSelection方法)。
  4. monitorSelection.GetCurrentSelection(out hierarchyPtr fails, because hierarchyPtr remains IntPtr.Zero. monitorSelection.GetCurrentSelection(out hierarchyPtr outboundPtr失败,因为hierarchyPtr仍为IntPtr.Zero。

Value cannot be null. 值不能为空。 Parameter name: pUnk 参数名称:pUnk

Perhaps you know a solution to retrieve the full path of a right-clicked file within the editor of Visual Studio (2017)? 也许您知道在Visual Studio(2017)的编辑器中检索右键单击文件的完整路径的解决方案?

Thank you in advance. 先感谢您。

    if (!IsSingleProjectItemSelection(out hierarchy, out itemid)) return;
        // Get the file path
        string itemFullPath = null;
        ((IVsProject) hierarchy).GetMkDocument(itemid, out itemFullPath);
        var transformFileInfo = new FileInfo(itemFullPath);    
        string fullPath = itemFullPath.FullName;

public static bool IsSingleProjectItemSelection(out IVsHierarchy   hierarchy, out uint itemid)
{
    hierarchy = null;
    itemid = VSConstants.VSITEMID_NIL;
    int hr = VSConstants.S_OK;

    var monitorSelection = Package.GetGlobalService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection;
    var solution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution;
    if (monitorSelection == null || solution == null)
    {
        return false;
    }

    IVsMultiItemSelect multiItemSelect = null;
    IntPtr hierarchyPtr = IntPtr.Zero;
    IntPtr selectionContainerPtr = IntPtr.Zero;

    try
    {
        hr = monitorSelection.GetCurrentSelection(out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainerPtr);

        if (ErrorHandler.Failed(hr) || hierarchyPtr == IntPtr.Zero || itemid == VSConstants.VSITEMID_NIL)
        {
            // there is no selection
            return false;
        }

        // multiple items are selected
        if (multiItemSelect != null) return false;

        // there is a hierarchy root node selected, thus it is not a single item inside a project

        if (itemid == VSConstants.VSITEMID_ROOT) return false;

        hierarchy = Marshal.GetObjectForIUnknown(hierarchyPtr) as IVsHierarchy;
        if (hierarchy == null) return false;

        Guid guidProjectID = Guid.Empty;

        if (ErrorHandler.Failed(solution.GetGuidOfProject(hierarchy, out guidProjectID)))
        {
            return false; // hierarchy is not a project inside the Solution if it does not have a ProjectID Guid
        }

        // if we got this far then there is a single project item selected
        return true;
    }
    finally
    {
        if (selectionContainerPtr != IntPtr.Zero)
        {
            Marshal.Release(selectionContainerPtr);
        }

        if (hierarchyPtr != IntPtr.Zero)
        {
            Marshal.Release(hierarchyPtr);
        }
    }
}

DTE.ActiveDocument.FullName返回您右键单击的文件的完整路径。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM