Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio协议处理程序-打开文件_C#_Visual Studio_Visual Studio 2015_Visual Studio Extensions_Protocol Handler - Fatal编程技术网

C# Visual Studio协议处理程序-打开文件

C# Visual Studio协议处理程序-打开文件,c#,visual-studio,visual-studio-2015,visual-studio-extensions,protocol-handler,C#,Visual Studio,Visual Studio 2015,Visual Studio Extensions,Protocol Handler,Visual Studio是否有包含打开特定文件的命令的协议处理程序 他们有一个用于Git clone的,如中所述: [在GitHub中]在Visual Studio中打开按钮调用名为“git client://”的新协议处理程序。我们与GitHub一起设计了这个新的通用协议,允许网站将标准Git操作传递给任何IDE 基本上,我想做的事情如下所述: 当我单击按钮时,VisualStudio应该打开特定的文件(最好同时加载正确的解决方案) 如果协议处理程序无法直接实现这一点,那么它是否可以作为一

Visual Studio是否有包含打开特定文件的命令的协议处理程序

他们有一个用于Git clone的,如中所述:

[在GitHub中]在Visual Studio中打开按钮调用名为“git client://”的新协议处理程序。我们与GitHub一起设计了这个新的通用协议,允许网站将标准Git操作传递给任何IDE

基本上,我想做的事情如下所述:

当我单击按钮时,VisualStudio应该打开特定的文件(最好同时加载正确的解决方案)


如果协议处理程序无法直接实现这一点,那么它是否可以作为一个具有Web视图的Visual Studio扩展来实现同样的目的(即允许从网页打开文件)?

我可以通过创建一个Visual Studio插件,该插件带有一个自托管的Owin服务器,公开一个基本的WebApi来实现我想要的功能

这使我能够从浏览器中打开具有以下链接的文件:

托管此按钮的任何web服务器都需要硬编码链接到
http://localhost:9000
,这带来了一个问题,即运行多个Visual Studio实例,因此需要一些关于如何将.sln文件映射到已知端口的逻辑。但是由于没有一个正式的VisualStudio解决方案,这在很大程度上完成了工作


如果这对将来的人有帮助,下面是代码片段:

VS套餐

[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初始值设定项

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

自Visual Studio 2017.6及更新版本起,此功能现在由Microsoft提供。看那个,救命啊!
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";
    }
}