如何檢查項目是否爲最新?VB.NET EnvDTE構建項目之前的最新檢查
我基本上是試圖以編程方式在列表中構建每個項目,但只有當它們已經改變。那麼有沒有人知道一種方式(使用EnvDTE也許)來檢查項目是否發生變化,因此需要編譯?
在此先感謝您的幫助。
如何檢查項目是否爲最新?VB.NET EnvDTE構建項目之前的最新檢查
我基本上是試圖以編程方式在列表中構建每個項目,但只有當它們已經改變。那麼有沒有人知道一種方式(使用EnvDTE也許)來檢查項目是否發生變化,因此需要編譯?
在此先感謝您的幫助。
使用EnvDTE.Document接口:
Document d = //get document
bool saved = d.Saved;
保存屬性將是錯誤的,如果該文件是骯髒的。
好的..所以我必須遍歷項目中的源代碼文件的整個列表,並檢查d.Saved然後正確嗎? 這聽起來像是一個很好的建議,但是您是否知道在項目級別執行此操作而不重複列表? 謝謝 – Kingamoon 2009-11-05 21:33:04
不,您只需要遍歷打開的窗口...如果您在編輯後關閉窗口,系統會提示您保存或放棄更改,因此關閉的窗口不會變髒。 EnvDTE.Windows將爲您提供所有打開的窗口的集合。 – 2009-11-05 21:44:40
我只想到一個方案,依靠d.Saved方法來確定項目是否過時或不會失敗。如果我有一個x.vb類,並對其進行更改。然後點擊保存,但不在那裏生成項目,那麼這個方法會失敗,因爲d.Saved將返回True(但項目處於髒模式)。我基本上在尋找Visual Studio IDE用來確定是編譯項目還是隻返回最新檢查的確切方法。 謝謝 – Kingamoon 2009-11-05 22:12:27
您可以使用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()來構建項目及其依賴項。
從理論上講,支持構建和重建命令的項目應該不會構建,如果構建不是必需的,所以您不必檢查任何內容,只需構建。如果該項目不支持這一點,那麼無論如何你都很有可能無法找到它的構建狀態。 – 2013-03-05 14:29:58
@SimonMourier如果您構建一個尚未更改的C#項目,事實上Visual Studio不會重新編譯代碼,但它仍將運行其後期構建事件等。不知何故,當您點擊F5並且沒有任何更改時, Visual Studio完全避免了這一點。我想自己也做同樣的事情。 – 2013-03-06 08:04:44
你只專注於C#項目嗎? – 2013-03-06 08:53:02