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
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";
}
}
fonte
2016-01-05 19:51:23