5

Visual Studio ha un gestore di protocollo che include un comando per aprire un file specifico?Gestore di protocollo di Visual Studio - Apri file

ne hanno uno per git clone, come descritto nella Announcing the GitHub Extension for Visual Studio:

Il pulsante Apri in Visual Studio [in GitHub] definisce un nuovo gestore di protocollo chiamato “git-client: //”. Abbiamo progettato questo nuovo protocollo generico insieme con GitHub per consentire un sito web passa operazioni Git standard per qualsiasi IDE

Essenzialmente quello che voglio fare è descritto in questo GitHub Issues:

enter image description here

Quando clicco sul pulsante, Visual Studio dovrebbe aprire il file specifico (preferibilmente con la corretta soluzione caricata pure).

Se questo non è possibile direttamente con i gestori di protocollo, potrebbe essere eseguito come un'estensione di Visual Studio con una visualizzazione Web che avrebbe lo stesso scopo (ovvero consentire l'apertura di file da una pagina Web)?

risposta

2

Sono stato in grado di avvicinarmi abbastanza a ciò che volevo creando un plug-in di Visual Studio con un server Owin ospitato autonomamente che esponesse un WebApi di base.

Questo mi ha permesso di aprire i file da un browser con un link del tipo: http://localhost:9000/VisualStudioApi/OpenFile?Path=.\Url\Escaped\Path\Relative\To\Solution\File

Opening files in Visual Studio via a web browser

Qualsiasi web server che ospita questo tasto avrebbe bisogno di hardcode i link per http://localhost:9000, che porta in primo piano una questione di avere più istanze di Visual Studio in esecuzione, quindi sarebbe necessario essere un po 'di logica su come mappare un file .sln su una porta conosciuta. Ma in assenza di una soluzione ufficiale di Visual Studio, questo è il lavoro più svolto.


Nel caso in cui questo aiuta qualcuno in futuro, qui ci sono i frammenti di codice:

VS pacchetto

[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"; 
    } 
}