使用Roslyn的工作区,有没有办法获取Visual Studio提供的活动IWorkspace的钩子?
我希望能够在Visual Studio中打开ExampleProject,然后在我自己的应用程序中,我想通过Roslyn.Services.Workspace
再次打开ExampleProject,但仅用于监视Visual Studio中生成的文件/代码更改。我运行了一个充满希望的测试,只是将项目加载到Workspace中,并希望它能以某种方式神奇地从磁盘中获取更改,但没有这样的运气。
唯一可能的是;
直接从Visual获取对当前加载的Workspace的引用 工作室。我不知道VS是否会在整个过程中暴露出这种情况 边界,或如何找出。
将我的整个项目重写为Visual Studio扩展,我在这里 可以自动访问打开的工作区。我不愿意 现在就深入建立一个扩展。
以下是我用来测试的一些代码:
public class ProjectDiskMonitor
{
public ProjectDiskMonitor(string fullProjectPath)
{
WS = Workspace.LoadStandAloneProject(fullProjectPath, null, null, null, true) as Workspace;
WS.WorkspaceChanged += new EventHandler<WorkspaceEventArgs>(TargetProjectChanged);
//this event is not being fired as I edit the project via another instance of VS
}
private void TargetProjectChanged(object sender, WorkspaceEventArgs e)
{
Console.WriteLine("Project changed");
}
private Workspace WS
{
get;
set;
}
}
答案 0 :(得分:1)
如果要调用Workspace.LoadSolution()来获取工作空间,请将“true”传递给LoadSolution的enableFileTracking参数,它将自动侦听文件系统并获取更改。不要忘记ISolution实例是不可变的,因此要获得新状态,您必须访问Workspace上的CurrentSolution属性才能获得更新状态。
目前无法以跨进程方式从Visual Studio获取IWorkspace,或者至少在没有构建自己的远程协议的情况下也是如此。