2017-04-03 36 views
2

過去,我爲C++項目做了許多MSBuild定製工作。 輸入輸出 MSBuild目標的屬性用於確定目標是否必須執行。此外,Visual Studio使用.tlog文件(位於中間目錄中)來確定是否必須調用MSBuild。Visual Studio如何確定它是否必須啓動MSBuild?

現在我正在開發一個C#項目。我寫了一個簡單的MSBuild目標,其將文件複製到輸出目錄:

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="CopyMyFile" BeforeTargets="AfterBuild" Inputs="$(ProjectDir)File.dat" Outputs="$(TargetDir)FileRenamed.dat"> 
    <Copy SourceFiles="$(ProjectDir)File.dat" DestinationFiles="$(TargetDir)FileRenamed.dat" OverwriteReadOnlyFiles="true"> 
    </Copy> 
    </Target> 
</Project> 

目標工作,如果構建是通過調用MSBuild.exe預期。如果目標文件不存在或源文件已被修改,則會複製該文件。

如果我調用Visual Studio中的構建,它不會按預期工作。如果我從輸出目錄中刪除文件,Visual Studio不會調用MSBuild。另一方面,即使沒有其他更改,修改源文件後每次構建項目時都會調用MSBuild。

看來,Visual Studio只是將項目中的每個文件與輸出文件(.exe,.dll或.pdb)進行比較。如果項目中的任何文件比輸出文件更新,則調用MSBuild。在我的情況下,MSBuild不更新.exe文件,所以MSBuild被一次又一次地調用。

在C++項目中,此行爲由.tlog文件控制。在C#項目中有類似的東西嗎?

非常感謝!

+0

.tlog文件不是由MSBuild直接使用,而是由Visual Studio決定是否需要調用MSBuild。我曾經爲自定義構建目標創建自己的.tlog文件,以控制何時Visual Studio必須調用MSBuild,何時不調用MSBuild。我希望有類似的技術可用於C#項目。 – alerosmile

+0

你確定嗎?即使不使用VS構建C++項目,但僅創建了msbuild tlog文件(並且可能在下一版本中再次讀入) – stijn

+0

您是對的。對不起,評論錯誤。但是,Visual Studio使用.tlog文件來決定是否需要調用MSBuild的假設仍然有希望。但無論如何,這並不重要。我需要的是一種告訴Visual Studio什麼時候調用MSBuild的方法,什麼時候不需要,因爲Visual Studio不知道我的自定義構建目標。 – alerosmile

回答

0

答案可能是否,與tlog機制沒有任何相似之處。我不是100%確定,也因爲奇怪,你不能做一些非常基本的事情,因爲這意味着MS基本上拋棄了C#(和類似)項目的跟蹤器材料,但並沒有用可以掛鉤的東西替代它由用戶。

使用procmon你可以看到VS獲取輸出和輸入文件的時間戳,但是無處找到一種干擾它作爲輸入和輸出文件處理的方式。它看起來像VS獲取了直接包含在項目文件中的所有內容(即VS中顯示的參考/內容/編譯/ ..項目組)的列表,而不是Taget的輸入/輸出中列出的內容,並且在開始時一個版本比較這些項目的時間戳。如果所有東西(包括VS在內的所有東西都被認爲是最新的)是最新的,那麼不會爲構建啓動msbuild進程。

有一個解決方法,雖然不是非常好:如果添加一個'虛擬'內容項目(例如,右鍵單擊項目 - >添加新項目 - >文本文件)並將其設置爲始終被複制(右鍵點擊文本文件剛剛添加 - >屬性 - >複製到輸出目錄 - >複製總是)然後VS將總是開始構建,因此檢查您的目標的輸入與輸出,並運行,如果如果你刪除FileRenamed.dat。

+0

我最近遇到了[IBuildUpToDateCheckProvider](https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.workspace.build.ibuilduptodatecheckprovider(v = vs.150).aspx)接口,它解決了這個問題。我不知道這是否是要走的路。我不喜歡的是,你必須擴展Visual Studio和MSBuild才能達到目標。 – alerosmile

+0

http://stackoverflow.com/q/43283613與此類似。在沒有寫VS擴展的C#項目中,VS項目中簡單的東西似乎是不可能的。 – alerosmile

相關問題