2009-11-09 21 views
3

某些標記擴展引發編譯錯誤。例如,如果無法找到引用的類,則StaticExtension(x:Static)會引發編譯錯誤。任何人都知道這個機制?它是否被烘焙到XAML編譯器中,或者它是否可用於自定義標記擴展?WPF標記擴展如何增加編譯錯誤?

編輯:下面的mfeingold提示我需要查看IVsErrorList接口,但是我不能立即看到如何幫助某人白色生成編譯時錯誤的標記擴展。任何例子?

回答

5

的XAML的結果擴展BAML編譯過程記錄其他錯誤

去年我遇到了同樣的問題。我寫了自己的擴展,希望在某些情況下編譯時發生錯誤,並發現從ProvideValue中拋出一個異常不起作用,因爲ProvideValue在實際加載XAML並創建對象樹之前未被調用。

我做了一些實驗,發現對x:Static編譯器錯誤消息是由該BAML編譯器完成一個優化的副產品。 BAML格式實際上具有特定類型的特定成員的概念,因此當XAML包含x:Static時,編譯器實際上將其替換爲直接引用成員而不是包含類型和方法名稱的特殊記錄。它通過顯式識別StaticExtension類來完成此操作。 TypeExtension有一個類似的優化。

我搜索了鉤,讓我有我的BAML編譯期間調用自己的代碼,但我沒有發現任何。 BAML編譯大多隻是對應於XAML的二進制格式的直接音譯,具有一些特定的優化但大多忽略了它所看到的內容。

最後我加入一個額外的步驟,以構建過程中,造型我的代碼斷Microsoft.WinFX.targets和其他內建目標文件。此步驟掃描XAML以查找我的標記擴展,檢查參數,並在它們不正確時生成編譯錯誤。這完全獨立於BAML的翻譯。當所有事情都說了,做完了,實施這項工作還需要幾天的時間,但我學到了很多東西。

買者有關創建自己的文件.targets

如果你想添加自己的.targets文件,你應該知道,除非您在本地機器上的SafeImports註冊表項的目標,無論是Visual Studio和Expression Blend會抱怨任何包含您的.targets文件的項目。此密鑰需要機器上的管理員訪問權限進行更新。這可能會或可能不會成爲問題,具體取決於您的部署方案。 (例如,一臺機器範圍的MSI安裝可以修復它,或者如果您只有少數幾臺開發機器,您可以手動設置密鑰)。在我的情況下,這並不重要,因爲我已經需要自定義.targets文件來處理我在該項目中做的其他事情。從構建任務

你不需要IVsErrorList的構建過程中添加錯誤到Visual Studio(如果你做到了,你就不能正確支持命令行版本,Expression Blend的

錯誤記錄,和其他工具)。

所有你需要做的是從呼叫Log.LogErrror Log.LogWarning您的構建任務裏面,像這樣:

public class CheckForErrorsInMyMarkupExtension : Task 
{ 
    ... parameters here ... 

    public override Execute() 
    { 
    ... code to load XAML and scan it for markup extension errors ... 
    ... when you discover an error ... 
     Log.LogError("I saw an error"); 
    } 
} 
0

有幾個VisualStudio的集成API,它可以讓你產生從MEF擴展(VS2010只)一個VSIntegration包裝或附加在自己的診斷消息。

檢出IVsErrorList接口以及OutputTaskItemString IVsOutputWindowPane接口的方法。後者是我在Django編輯器中使用的。

至當然這些方法的調用烘烤成XAML編譯器 - 他們怎麼可能不,它們是基於解析

+0

這些接口在VS2010是新的呢?當我說「出爐」時,我的意思是VS是否具有可能導致編譯時錯誤的單個標記擴展的具體知識,或者這種機制是通過使用接口,屬性等來擴展的。您的答案似乎表明這是VS2008的情況下,但VS2010已經開放。那是對的嗎? – Grokys 2009-11-09 16:24:08

+0

至少從VS2005開始就沒有接口。 MEF擴展是一種新的更好的方式來擴展Visual Studio – mfeingold 2009-11-09 16:44:01

+0

嗯,看看IVsErrorList的文檔,我仍然不明白你將如何實現自定義標記擴展,從而產生編譯時錯誤。更新問題以尋求exmaple ... – Grokys 2009-11-09 18:23:17