2012-07-31 33 views
0

使用Roslyn的工作區,有什麼方法可以獲取由Visual Studio提供的活動IWorkspace的鉤子?從外部VS主機環境中檢測VS對IWorkspace的更改?

我希望能夠在Visual Studio中打開ExampleProject,然後在我自己的應用程序中,我想通過Roslyn.Services.Workspace再次打開ExampleProject,但僅用於監視在Visual Studio中生成的文件/代碼更改。我進行了一次充滿希望的測試,只是將項目加載到Workspace中,希望它能以某種方式神奇地從磁盤中獲取更改,但沒有這樣的運氣。

這留下了唯一的可能性;

  1. 獲取從Visual Studio的 目前直接加載工作區的參考。我不知道如果VS甚至跨越過程 界限,或如何找出。

  2. 將我的整個項目重做爲Visual Studio擴展,其中我 可以自動訪問打開的Workspace。我不想 現在就開始着手構建擴展。

下面是一些代碼我用來測試:

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

如果您呼叫Workspace.LoadSolution()來獲取工作區,通過「真」到LoadSolution和它的enableFileTracking參數」會自動收聽文件系統並獲取更改。不要忘記,ISolution實例是不可變的,所以要獲得新的狀態,您必須訪問Workspace上的CurrentSolution屬性才能獲得更新的狀態。

目前沒有辦法以跨進程方式從Visual Studio中獲取IWorkspace,或者至少不是沒有構建自己的遠程協議。

+0

我正在使用Workspace.LoadStandaloneProject,它具有fileTracking相同的可選參數。但是,當我測試它時,Workspace.WorkspaceChanged事件不會在我編輯+另存爲Visual Studio的其他實例時被觸發。是否有另一個文件跟蹤更改通道?我已經細讀了IProject和ISolution類型,沒有明顯的發現。 – 2012-07-31 03:30:22

+0

嗯,這應該工作... – 2012-07-31 04:57:13

+0

現在,我只是要使用FileSystemWatcher來監視文件,並且當檢測到更改時,我調用ReloadDocument。當我從Workspace中手動調用ReloadDocument時,WorkspaceChanged事件會觸發。 – 2012-07-31 07:21:54