0

使用 Roslyn 的工作区,有没有办法获得一个挂钩到 Visual Studio 提供的活动 IWorkspace?

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

剩下的唯一可能性是;

  1. 直接从 Visual Studio 获取对当前加载的工作区的引用。我不知道 VS 是否甚至跨进程边界暴露了这一点,或者如何找出来。

  2. 将我的整个项目重新设计为 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;
    }
}
4

1 回答 1

1

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

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

于 2012-07-31T03:02:07.410 回答