5

Verfügt Visual Studio über einen Protokollhandler, der einen Befehl zum Öffnen einer bestimmten Datei enthält?Visual Studio-Protokollhandler - Datei öffnen

Sie haben einen für Git-Klon, wie in Announcing the GitHub Extension for Visual Studio beschrieben:

Das Open in Visual Studio-Taste [in GitHub] rufen ein neuer Protokoll-Handler „Git-Client: //“ genannt. Wir haben dieses neue generische Protokoll zusammen mit GitHub

eine Website passieren Standard Git-Operationen auf jede IDE ermöglichen

Wesentlichen, was ich tun möchte, in diesem GitHub Issues beschrieben:

enter image description here

Wenn ich auf Auf der Schaltfläche sollte Visual Studio die spezifische Datei öffnen (vorzugsweise mit der richtigen Lösung, die ebenfalls geladen wurde).

Wenn dies nicht direkt mit Protokollhandlern möglich ist, könnte es als Visual Studio Extensions mit einer Webansicht ausgeführt werden, die denselben Zweck erfüllen würde (dh das Öffnen von Dateien von einer Webseite zulassen)?

Antwort

2

Ich konnte nahe genug an das heran kommen, was ich wollte, indem ich ein Visual Studio-Plugin mit einem selbst gehosteten Owin-Server erstellte, der ein einfaches WebApi enthüllte. Diese

mir erlaubt, mit einem Link-Dateien von einem Browser zu öffnen, wie: http://localhost:9000/VisualStudioApi/OpenFile?Path=.\Url\Escaped\Path\Relative\To\Solution\File

Opening files in Visual Studio via a web browser

Jeden Web-Server auf diese Schaltfläche Hosting müßte die Links http://localhost:9000 codieren, die ein Problem bringt die Da mehrere Visual Studio-Instanzen ausgeführt werden, muss eine Logik zum Zuordnen einer SLN-Datei zu einem bekannten Port vorhanden sein. Ohne eine offizielle Visual Studio-Lösung wird dies größtenteils erledigt.


Falls dies jemand in der Zukunft hilft, hier ist der Code-Schnipsel:

VS-Paket

[ComVisible(true)] 
[Guid("B77F7C65-0F9F-422A-A897-C06FDAEC9604")] 
[ProvideObject(typeof(InitializerPackage))] 
[ProvideAutoLoad(UIContextGuids80.SolutionExists)] 
public class InitializerPackage : Package 
{ 
    protected override void Initialize() 
    { 
     base.Initialize(); 

     //Get copy of current DTE 
     var dte = (DTE)GetService(typeof(DTE)); 
     var dte2 = dte as DTE2; 

     dte2.Events.SolutionEvents.Opened +=() => 
      OwinVisualStudioApiListenerManager.StartServer(dte2); 
     dte2.Events.SolutionEvents.AfterClosing +=() => 
      OwinVisualStudioApiListenerManager.StopServer();   
    } 
} 

Owin Initializer

public static class OwinVisualStudioApiListenerManager 
{ 
    private static IDisposable _runningServer; 

    public static DTE2 VisualStudioApi { get; set; } 

    public static void StartServer(DTE2 visualStudioApi) 
    { 
     if (null != _runningServer) 
      _runningServer.Dispose(); 

     VisualStudioApi = visualStudioApi; 

     //nothing fancy about OwinStartup 
     //see github file http://tinyurl.com/zt2bm8b 
     _runningServer = WebApp.Start<OwinStartup>("http://localhost:9000"); 
    } 

    public static void StopServer() 
    { 
     if (null != _runningServer) 
      _runningServer.Dispose(); 

     VisualStudioApi = null; 
    } 
} 

WebApi

public class VisualStudioApiController : ApiController 
{ 
    // GET /VisualStudioApi/OpenFile/?path= 
    [HttpGet] 
    public string OpenFile(string path) 
    { 
     var fullPath = Path.Combine(
       Path.GetDirectoryName(
        OwinVisualStudioApiListenerManager.VisualStudioApi.Solution.FullName), 
       HttpUtility.UrlDecode(path)); 

      //http://stackoverflow.com/q/5039226/1224069 
      OwinVisualStudioApiListenerManager.VisualStudioApi 
       .ExecuteCommand(
        "File.OpenFile", 
        fullPath); 

      return "success"; 
    } 
}