【小生雜談】ASP.Net_Compiler的編譯過程
最近手頭的一個ASP.Net的專案不時會出現編譯錯誤,提示某個控制元件ascx類不存在,但該控制元件明明就在同一個網站下。錯誤有時候會突然出現,而一旦出現錯誤再多次編譯也無法消除。由於公司使用指令碼編譯,而不是用msbuild或Visual Studio直接編譯。事實上用Visual Studio編譯從來沒有出過錯。用ProcExp看了一下build時編譯時到底執行了什麼:
主要就是這一條命令。難道是編譯器有bug?再細究發現aspnet_compiler.exe又呼叫了csc.exe(C#編譯器):
到Temporary ASP.NET Files\root\1c85b622\f7798d18目錄下檢視,發現很多.cmdline, .err, .out, .compiled等檔案,還有很多.cs檔案!原來那些網頁或AppCode下的.cs檔案在這裡被重組並分組了:App_Code.n.cs; App_Web_
但怎麼決定檔案的分組呢,哪些檔案要放在前面的組,哪裡檔案要放在後面?我們在.aspx.xxx.compiled或.ascx.xxx.compiled裡發現了該檔案依賴於哪些檔案的資訊:
<preserve resultType="3" virtualPath="/Result.aspx" hash="84d987223" filehash="a23fecda9fe4d6d8" flags="110000" assembly="App_Web_wt3qqawy" type="ASP.result_aspx">
<filedeps>
<filedep name="/controls/Control1.ascx" />
<filedep name="/controls/Control1.ascx.cs" />
<filedep name="/Result.aspx" />
<filedep name="/Result.aspx.cs" />
filedeps>
preserve>
於是猜想編譯器就是在記憶體中維護用這樣的依賴關係,並可以產生一個樹來決定檔案分組先後。但.compiled檔案只在編譯成功那個頁面後才會生成。
明白了這些,再來找專案的問題:原來Result.aspx.cs裡動態建立了Control2:
page.PlaceHolder.Controls.Add(ctrl);
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-407094/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 淺談Android的資源編譯過程Android編譯
- 編譯器的編譯基本過程編譯
- 編譯過程編譯
- Javac編譯過程Java編譯
- 編譯核心過程編譯
- 編譯器的工作過程編譯
- EVC編譯TCPMP的過程編譯TCP
- 編譯連結過程編譯
- 編譯過程簡介編譯
- C++ 編譯過程C++編譯
- JavaScript的預編譯過程分析JavaScript編譯
- 編譯C++ 程式的過程編譯C++
- ios底層 編譯過程iOS編譯
- .NET 程式碼編譯過程編譯
- glade 編譯過程 (轉)編譯
- vlc-android 的編譯過程Android編譯
- 編譯器的工作過程和原理編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- GCC編譯和連結過程GC編譯
- go語言編譯過程概述Go編譯
- 預編譯過程(AO+GO)編譯Go
- C程式編譯過程淺析C程式編譯
- Android 專案編譯過程Android編譯
- Android Makefile 編譯過程分析Android編譯
- Hive SQL 編譯過程詳解HiveSQL編譯
- C語言編譯全過程C語言編譯
- 儲存過程編譯時卡死儲存過程編譯
- iOS編譯過程的原理和應用iOS編譯
- 初探 Go 的編譯命令執行過程Go編譯
- ASPNet_Compiler的編譯過程Compile編譯
- CMM編譯器和C編譯器過程呼叫實現的比較編譯
- Hive SQL的底層編譯過程詳解HiveSQL編譯
- Vue.js 1.0 的 DOM 編譯過程解析Vue.js編譯
- [轉]:xmake編譯配置過程詳解編譯
- 詳解Linux 程式編譯過程Linux編譯
- 3- C語言編譯過程C語言編譯
- C語言編譯過程簡介C語言編譯
- oracle 儲存過程重新編譯方法Oracle儲存過程編譯