2009-11-05 39 views
4

如何檢查項目是否爲最新?VB.NET EnvDTE構建項目之前的最新檢查

我基本上是試圖以編程方式在列表中構建每個項目,但只有當它們已經改變。那麼有沒有人知道一種方式(使用EnvDTE也許)來檢查項目是否發生變化,因此需要編譯?

在此先感謝您的幫助。

+1

從理論上講,支持構建和重建命令的項目應該不會構建,如果構建不是必需的,所以您不必檢查任何內容,只需構建。如果該項目不支持這一點,那麼無論如何你都很有可能無法找到它的構建狀態。 – 2013-03-05 14:29:58

+0

@SimonMourier如果您構建一個尚未更改的C#項目,事實上Visual Studio不會重新編譯代碼,但它仍將運行其後期構建事件等。不知何故,當您點擊F5並且沒有任何更改時, Visual Studio完全避免了這一點。我想自己也做同樣的事情。 – 2013-03-06 08:04:44

+0

你只專注於C#項目嗎? – 2013-03-06 08:53:02

回答

0

使用EnvDTE.Document接口:

Document d = //get document 
bool saved = d.Saved; 

保存屬性將是錯誤的,如果該文件是骯髒的。

+0

好的..所以我必須遍歷項目中的源代碼文件的整個列表,並檢查d.Saved然後正確嗎? 這聽起來像是一個很好的建議,但是您是否知道在項目級別執行此操作而不重複列表? 謝謝 – Kingamoon 2009-11-05 21:33:04

+0

不,您只需要遍歷打開的窗口...如果您在編輯後關閉窗口,系統會提示您保存或放棄更改,因此關閉的窗口不會變髒。 EnvDTE.Windows將爲您提供所有打開的窗口的集合。 – 2009-11-05 21:44:40

+2

我只想到一個方案,依靠d.Saved方法來確定項目是否過時或不會失敗。如果我有一個x.vb類,並對其進行更改。然後點擊保存,但不在那裏生成項目,那麼這個方法會失敗,因爲d.Saved將返回True(但項目處於髒模式)。我基本上在尋找Visual Studio IDE用來確定是編譯項目還是隻返回最新檢查的確切方法。 謝謝 – Kingamoon 2009-11-05 22:12:27

0

您可以使用UpToDate屬性VCConfiguration

假設你可以得到實例EnvDTE.DTE就可以得到所需的VCProjectEngineVCConfiguration對活動的項目是這樣的:

public Project GetSolutionStartupProject(DTE dte) 
{ 
    string startupProjectName = String.Empty; 

    SolutionBuild solutionBuild = dte.Solution.SolutionBuild as SolutionBuild; 
    foreach (string item in solutionBuild.StartupProjects as Array) 
    { 
    startupProjectName += item; 
    } 

    return dte.Solution.Item(startupProjectName); 
} 

public void BuildStartupProject(DTE dte) 
{ 
    Project project = GetSolutionStartupProject(dte); 
    Configuration activeConfiguration = project.ConfigurationManager.ActiveConfiguration; 

    // annoyingly can't just do activeConfiguration.Object as VCConfiguration 
    // 
    VCProject vcProject = project.Object as VCProject; 
    VCConfiguration vcActiveConfiguration = null; 
    foreach (VCConfiguration vcConfiguration in vcProject.Configurations) 
    { 
    if (vcConfiguration.ConfigurationName == activeConfiguration.ConfigurationName && 
     vcConfiguration.Platform.Name == activeConfiguration.PlatformName) 
    { 
     vcActiveConfiguration= vcConfiguration; 
     break; 
    } 
    } 

    if (!vcActiveConfiguration.UpToDate) 
    { 
    vcActiveConfiguration.Build(); 
    } 
} 

如果你想要做的所有項目解決方案然後它會更容易,因爲你不需要找到啓動項目。最重要的部分是DTE 項目的實例轉換爲VCProjectEngineVCProject,循環的VCConfigurations一旦你做到了這一點應該很容易。

還值得注意的是VCConfiguration.Build()將只生成該配置,如果依賴關係尚未建立,則會失敗。您可以使用SolutionBuild.BuildProject()來構建項目及其依賴項。

+0

這看起來不錯,但是有沒有一種解決方案也適用於C#項目? – 2013-03-08 21:55:40

+0

爲什麼不能用於C#項目? – fun4jimmy 2013-03-09 01:42:47

+0

對不起,沒有意識到。我正在瀏覽我認爲你也完成了的MSDN文檔,似乎無法看到任何內容。我會繼續尋找,但它看起來並不像有辦法。 – fun4jimmy 2013-03-10 14:46:21