Visual Studio 协议处理程序 - 打开文件
Visual Studio Protocol Handler - Open File
Visual Studio 是否有包含打开特定文件的命令的协议处理程序?
他们有一个用于 Git 克隆,如 Announcing the GitHub Extension for Visual Studio:
中所述
The Open in Visual Studio button [in GitHub] calls a new protocol handler called “git-client://”. We designed this new generic protocol together with GitHub to allow a website pass standard Git operations to any IDE
基本上我想做的是在这个GitHub Issues:
中描述的
当我单击按钮时,Visual Studio 应该打开特定文件(最好同时加载正确的解决方案)。
如果无法直接使用协议处理程序,是否可以将其作为 Visual Studio 带有 Web 视图的扩展来实现相同的目的(即允许从网页打开文件)?
通过使用自托管 Owin 服务器公开基本 WebApi 创建 Visual Studio 插件,我能够足够接近我想要的东西。
这让我可以使用 link 从浏览器打开文件,例如:
http://localhost:9000/VisualStudioApi/OpenFile?Path=.\Url\Escaped\Path\Relative\To\Solution\File
托管此按钮的任何 Web 服务器都需要将 link 硬编码为 http://localhost:9000
,这会带来一个问题,即具有多个 Visual Studio 实例 运行,因此需要一些关于如何将 .sln 文件映射到已知端口的逻辑。但是由于缺少官方 Visual Studio 解决方案,这可以完成大部分工作。
如果这对以后的人有帮助,这里是代码片段:
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;
}
}
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));
//
OwinVisualStudioApiListenerManager.VisualStudioApi
.ExecuteCommand(
"File.OpenFile",
fullPath);
return "success";
}
}
Visual Studio 是否有包含打开特定文件的命令的协议处理程序?
他们有一个用于 Git 克隆,如 Announcing the GitHub Extension for Visual Studio:
中所述The Open in Visual Studio button [in GitHub] calls a new protocol handler called “git-client://”. We designed this new generic protocol together with GitHub to allow a website pass standard Git operations to any IDE
基本上我想做的是在这个GitHub Issues:
中描述的当我单击按钮时,Visual Studio 应该打开特定文件(最好同时加载正确的解决方案)。
如果无法直接使用协议处理程序,是否可以将其作为 Visual Studio 带有 Web 视图的扩展来实现相同的目的(即允许从网页打开文件)?
通过使用自托管 Owin 服务器公开基本 WebApi 创建 Visual Studio 插件,我能够足够接近我想要的东西。
这让我可以使用 link 从浏览器打开文件,例如: http://localhost:9000/VisualStudioApi/OpenFile?Path=.\Url\Escaped\Path\Relative\To\Solution\File
托管此按钮的任何 Web 服务器都需要将 link 硬编码为 http://localhost:9000
,这会带来一个问题,即具有多个 Visual Studio 实例 运行,因此需要一些关于如何将 .sln 文件映射到已知端口的逻辑。但是由于缺少官方 Visual Studio 解决方案,这可以完成大部分工作。
如果这对以后的人有帮助,这里是代码片段:
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;
}
}
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));
//
OwinVisualStudioApiListenerManager.VisualStudioApi
.ExecuteCommand(
"File.OpenFile",
fullPath);
return "success";
}
}