通过VS从外部VS主机环境检测IWorkspace更改?

时间:2012-07-31 01:51:31

标签: c# visual-studio-2010 roslyn

使用Roslyn的工作区,有没有办法获取Visual Studio提供的活动IWorkspace的钩子?

我希望能够在Visual Studio中打开ExampleProject,然后在我自己的应用程序中,我想通过Roslyn.Services.Workspace再次打开ExampleProject,但仅用于监视Visual Studio中生成的文件/代码更改。我运行了一个充满希望的测试,只是将项目加载到Workspace中,并希望它能以某种方式神奇地从磁盘中获取更改,但没有这样的运气。

唯一可能的是;

  1. 直接从Visual获取对当前加载的Workspace的引用 工作室。我不知道VS是否会在整个过程中暴露出这种情况 边界,或如何找出。

  2. 将我的整个项目重写为Visual Studio扩展,我在这里 可以自动访问打开的工作区。我不愿意 现在就深入建立一个扩展。

  3. 以下是我用来测试的一些代码:

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

1 个答案:

答案 0 :(得分:1)

如果要调用Workspace.LoadSolution()来获取工作空间,请将“true”传递给LoadSolution的enableFileTracking参数,它将自动侦听文件系统并获取更改。不要忘记ISolution实例是不可变的,因此要获得新状态,您必须访问Workspace上的CurrentSolution属性才能获得更新状态。

目前无法以跨进程方式从Visual Studio获取IWorkspace,或者至少在没有构建自己的远程协议的情况下也是如此。