HOW TO:產生適用於 .NET 程式碼的相依性圖形
若要探索 .NET 程式碼的組織和關聯性,請使用 Visual Studio Ultimate 產生相依性圖形。 使用這些圖形有助於您視覺化、探索和分析程式碼的相依性。 這種圖形以一組用連結或邊緣相連的節點,表示程式碼項目及其關聯性。
注意事項 |
---|
如果您的方案很大,產生相依性圖形可能會導致記憶體用完例外狀況。 如果發生這種情況,請縮小方案的範圍。 您也可以使用架構總管選取要視覺化的專案和相依性,然後產生圖形。 |
若要產生 C 和 C++ 程式碼及 Web 專案的相依性圖形,請下載和安裝Microsoft Visual Studio 2010 Visualization and Modeling 功能套件。
如需詳細資訊,請參閱:
選擇要產生的相依性圖形
Visual Studio Ultimate 可讓您快速產生圖形文件以探索程式碼的相依性。若要使用命令列工具產生圖形文件,請參閱產生要批次處理的圖形文件。
若要 |
產生可顯示具有下列關聯性的圖形 |
---|---|
查看原始程式碼的概觀 |
在 Visual Studio 方案中所有組件、所有命名空間或所有類別之間的關聯性。 圖形會顯示您所選節點最上層的彙總相依性。 |
查看原始程式碼中的特定相依性 |
在 Visual Studio 方案中選取的原始程式碼區域之間的關聯性。 使用 [架構總管] 可讓您以階層方式瀏覽程式碼,以及選取特定類型的結構和關聯性。 |
查看已編譯程式碼的概觀 |
在一個或多個 .NET 組件 (.dll) 檔案或可執行檔 (.exe) 檔案中 |
查看已編譯程式碼中的特定相依性 |
在 .NET 組件 (.dll) 或可執行檔 (.exe) 中的所選區域之間。 使用 [架構總管] 可讓您瀏覽並選取特定種類的結構和關聯性。 |
在您產生圖形之後,您可以採用不同方式來使用此圖形探索程式碼。 如需詳細資訊,請參閱 HOW TO:使用相依性圖形探索程式碼。
在 Visual Studio 方案中查看原始程式碼的概觀
開啟方案。
指向 [架構] 功能表上的 [產生相依性圖形],然後執行下列其中一個步驟:
按一下
以產生圖形來顯示
依組件
所有由方案產生的組件之間的彙總相依性,以及這些組件所依賴的任何外部相依性。
若要查看組件內部的命名空間、類別和方法,請展開圖形上的組件。 外部組件只會顯示正在使用中的項目。
依命名空間
方案中所有命名空間之間的彙總相依性,以及程式碼所依賴的任何外部命名空間。
若要查看命名空間內部的類別和方法,請展開圖形上的命名空間。 外部命名空間只會顯示正在使用中的項目。
依類別
方案中所有類別之間的彙總相依性。 程式碼所使用之外部類別的相關資訊並不會顯示。
-或-
若要查看跨多種結構類型的相依性,請按一下 [自訂]。
在 [產生相依性圖形] 對話方塊中,至少按一下右列其中一個方塊:[組件]、[命名空間]、[型別] 或 [方法]。
使用下表篩選圖形:
若要
請執行這些步驟
查看外部相依性的參考。
這麼做對探索內部組件在外部組件上的建置方式相當有用。
選取 [外部]
僅查看具有特定存取層級的型別和方法。
例如,您可能只要選取公用型別以簡化圖形。
展開 [存取篩選] 窗格,然後選取您想要的層級。
注意事項您至少必須選取一個型別存取層級。若要減少圖形上的相依性數目,請只針對方法選取您想要的存取層級。將內含項目關聯性顯示為巢狀群組,並將相依性顯示為彙總連結,以查看高階相依性。
注意事項方法的相依性將會顯示為個別連結,而非彙總連結,因為方法是最下層分葉節點。選取 [將內含項目顯示為群組] 方塊。
將內含項目關聯性顯示為連結的節點,並將相依性顯示為個別連結,以查看低階相依性。
清除 [將內含項目顯示為群組] 方塊。
完成後,請按一下 [確定]。
Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。
彙總相依性連結的粗細指出有多少彙總相依性所表示的個別相依性。 若要查看連結所表示之相依性的種類,請將指標移至連結上方直到出現工具提示為止。
注意事項 您從 [架構] 功能表產生的相依性圖形,不會顯示對最具衍生性的型別所發出的虛擬方法呼叫。 它們會顯示的是宣告這些虛擬成員的型別上的相依性。 但您可以使用 [架構總管] 中的 [類別檢視] 尋找這些呼叫。 然後,您便可以將這些呼叫從 [架構總管] 拖曳至現有圖形,或是從 [架構總管] 工具列產生新的圖形。
在 Visual Studio 方案中查看原始程式碼中的特定相依性
使用 [架構總管],可讓您尋找要視覺化的程式碼和關聯性。 您也可以使用預先定義的查詢來產生圖形。
開啟方案。
如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。
在 [架構總管] 第一個資料行的 [Visual Studio] 底下,按下列其中一個檢視:
[類別檢視],探索程式碼的邏輯階層。
用來瀏覽命名空間、型別、方法等項目。
[方案檢視],探索程式碼的實體階層。
用來瀏覽專案、原始程式檔等項目。
在下一個資料行中,選取您想要探索的項目。 若要選取資料行中的所有項目,請按下 CTRL+A。
下一個資料行隨即根據該資料行項目及關聯性的預設種類,顯示與選取項目相關的項目。
注意事項 若要選取其他種類的項目及關聯性,請展開包含您所選項目之資料行右側的折疊資料行。 在 [節點巡覽] 底下,選取您想要的項目種類。 在 [對外巡覽] 或 [對內巡覽] 底下,選取您想要的關聯性種類。 如需詳細資訊,請參閱 HOW TO:使用架構總管尋找程式碼。
重複執行步驟 4,直到您選取想要的所有項目為止。
注意事項 若要在圖形上包含 [呼叫] 相依性,請瀏覽至您選取之類別所呼叫的全部方法,並且選取這些方法。
若要從選取項目建立新圖形,請按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。
Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。
-或-
若要將選取項目加入至現有圖形或空白圖形,請依照下列步驟執行:
開啟現有圖形的 .dgml 檔案,或建立空白圖形。
按一下 [架構總管] 標題列底下的 [將所有選取的節點加入到目前的可見圖形文件]。
-或-
將節點從 [架構總管] 拖曳至圖形。
建立空白圖形
若要開啟空白圖形,請指向 [檔案] 功能表上的 [新增],然後按一下 [檔案]。
-或-
若要將空白圖形加入至 [方案項目] 資料夾,請以滑鼠右鍵按一下 [方案總管] 中最上層的方案節點,然後按一下 [加入新項目]。
在 [已安裝的範本] 底下,按一下 [一般]。
在右窗格中,按一下 [有向圖形文件]、指定圖形名稱,然後按一下 [加入]。
如需各種與圖形進行互動之方式的詳細資訊,請按一下空白圖形上出現的說明連結。
使用預先定義的查詢瀏覽原始程式碼
開啟方案。
如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。
在 [架構總管] 第一個資料行的 [已儲存的 DGQL 查詢] 底下,按一下 [在資料夾中]。
在下一個資料行中,依據您要建立的圖形種類,按下列其中一個查詢:
若要產生圖形以顯示
請按一下
方案參考的所有組件。
您可以從查詢結果產生顯示這些組件間相依性的圖形。
All Assembly References.dgql
在方案中所有輸出組件的一般清單,不含相依性連結。
All Output Assemblies.dgql
若要為選取的組件產生標準相依性圖形,請依照下列步驟執行:
在下一個資料行中,選取您想要的組件。
在目前資料行的右側,按一下摺疊的動作資料行加以展開。
注意事項當您將指標移至動作欄上方時,它就會反白顯示。在動作欄的 [命令] 底下,按一下 [標準圖形]。
方案中的所有專案。
您可以從查詢結果產生顯示這些專案間交互參考的圖形。
All Project References.dgql
在方案中所有專案的一般清單。
如果您的方案包含方案資料夾,這份清單將與您在 [架構總管] 中按一下 [方案檢視] 時出現的清單不同。
All Projects.dgql
方案中的所有型別。
您可以從查詢結果產生顯示這些型別間繼承關係的圖形。
Inheritance Graph.dgql
下一個資料行會將結果顯示為一般清單。 雖然連結可能存在於這些節點之間,但不會在 [架構總管] 中出現。
若要為結果資料行中的所有項目產生圖形 (包括連結),請依照下列步驟執行:
在結果資料行中按 CTRL+A,選取所有項目。
按住 CTRL 鍵不放,只將圖形上目前資料行中的項目納入,然後按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。
Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。
查看已編譯程式碼的概觀
建立空白圖形,或開啟現有圖形的 .dgml 檔案。
從 Visual Studio 外面將 .dll 檔或 .exe 檔拖曳至圖形。
注意事項 不支援從 [方案總管] 中的 [參考] 資料夾進行拖曳。 只要您是以相同的使用者存取控制 (UAC) 權限等級執行 [Windows 檔案總管] 與 Visual Studio,就可以從 [Windows 檔案總管] 拖曳組件。 例如,如果 UAC 已開啟,而您是以系統管理員身分執行 Visual Studio,那麼 [Windows 檔案總管] 將會封鎖拖曳作業。 若要解決這個問題,您可以關閉 UAC 或使用預先定義的查詢來探索方案。
查看已編譯程式碼中的特定相依性
如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。
在第一個資料行中的 [檔案系統] 底下,按一下 [選取檔案]。
在 [開啟] 方塊中,瀏覽至 .dll 檔或 .exe 檔,再選取並開啟這些檔案。
選取下一個資料行中的組件。 若要選取資料行中的所有項目,請按下 CTRL+A。
下一個資料行隨即根據該資料行項目及關聯性的預設種類,顯示與選取項目相關的項目。
注意事項 若要選取其他種類的項目及關聯性,請展開包含您所選項目之資料行右側的折疊資料行。 當您將指標移至動作欄上方時,它就會反白顯示。 在 [節點巡覽] 底下,選取您想要的項目種類。 在 [對外巡覽] 或 [對內巡覽] 底下,選取您想要的關聯性種類。 如需詳細資訊,請參閱 HOW TO:使用架構總管尋找程式碼。
選擇下列其中一項:
若要從下列項目建立相依性圖形
請依照下列步驟:
組件
在包含組件之資料行的右側,按一下摺疊的動作資料行加以展開。
當您將指標移至動作欄上方時,它就會反白顯示。
在動作欄的 [命令] 底下,按一下 [標準圖形]。
物件和方法
瀏覽類別和方法,並選取您要在圖形中包含的所有項目。
若要建立新圖形,請按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。
Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。
-或-
若要將選取項目加入至現有圖形或空白圖形,請依照下列步驟執行:
開啟現有圖形的 .dgml 檔案,或建立空白圖形。
按一下 [架構總管] 標題列底下的 [將所有選取的節點加入到目前的可見圖形文件]。
-或-
將節點從 [架構總管] 拖曳至圖形。
產生批次處理的圖形文件
若要以批次模式產生圖形文件 (.dgml 檔案),請使用 GraphCmd.exe 命令列工具。 例如,您可以在每次建置之後執行此工具,以尋找在不同組建之間有所變更的相依性。
若要尋找此工具,請查看下列資料夾:C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE。
注意事項 |
---|
GraphCmd.exe 只會為組件或 .dgml 檔案產生相依性資訊,而不會為 Visual Studio 方案或專案檔中的原始程式碼產生此資訊。 |
GraphCmd.exe 的語法如下:
GraphCmd -? -all -exceptions -input File_Name -query File_Name -exec
"DGQL_Statement" -output File_Name -path alias=path
下表說明 GraphCmd.exe 的選項:
-? |
顯示 GraphCmd.exe 的說明。 |
-all |
包含所有中繼查詢結果,而不只包含最後一個節點集的結果。 |
-exceptions |
以圖形文件 (.dgml) 檔案的形式報告查詢例外狀況。 |
-input File_Name |
處理指定的 .dgml 檔案。 當您對龐大的 .dgml 檔案進行後續處理並加以篩選,以便於在 Visual Studio 中加以視覺化時,此選項會有所幫助。 |
-query File_Name |
執行指定的有向圖形查詢語言 (DGQL 或 .dgql) 檔案。 如需詳細資訊,請參閱:
|
-exec "DGQL_Statement" |
執行指定的 DGQL 陳述式。 如需詳細資訊,請參閱了解有向圖形查詢語言 (DGQL)。 |
-output File_Name |
輸出指定的 .dgml 檔案。 |
-path alias=path |
指定要在 DGML 文件的輸入與輸出中使用的新別名。 例如:
如需詳細資訊,請參閱常用路徑的別名。 |
備註
由於 GraphCmd.exe 是在 Visual Studio 以外執行,因此可在 .dgql 查詢中支援的動作實屬有限。
您可以多次指定下列選項:-input、-query、-exec 和 -path。
常用路徑的別名
常用路徑的別名有助於縮減 .dgml 檔案的大小,以及載入或儲存該檔案所需的時間。 若要建立別名,請在 .dgml 檔案的結尾加入 <Paths></Paths> 區段。 在這個區段加入 <Path/> 項目,以定義路徑的別名:
<Paths>
<Path Id="MyPathAlias" Value="C:\...\..." />
</Paths>
若要從 .dgml 檔案中的某個項目參考別名,請以貨幣符號 ($) 和括號 (()) 括住 <Path/> 項目的 Id:
<Nodes>
<Node Id="MyNode" Reference="$(MyPathAlias)MyDocument.txt" />
</Nodes>
<Properties>
<Property Id="Reference" Label="My Document" DataType="System.String" IsReference="True" />
</Properties>
如需編輯 .dgml 檔案的詳細資訊,請參閱 HOW TO:編輯和自訂圖形文件。
了解有向圖形查詢語言 (DGQL)
DGQL 是可用以建置 DGML 的輕量型查詢語言。 DGQL 陳述式採取節點選取和動作交替出現的模式,也就是說每次的節點選取會成為下一個動作的輸入,而該動作的輸出又會成為下一次節點選取的輸入,依此類推。
DGQL 陳述式的格式如下:
<node selection> / <action> / <node selection> / <action> / ...
下表說明用以選取節點的 DGQL 語法:
* |
選取所有節點。 |
+ "text" |
選取所有包含 "text" 的節點。 |
+ Id.Equals("text") |
選取 Id 等於 "text" 的所有節點。 |
+ Background.Contains("text") |
選取 Background 屬性的值包含字串 "text" 的所有節點。 |
+ "text1" + "text2" + ... |
選取所有符合 "text1" 或 "text2" 的節點。 |
+ MyProperty="True" |
選取所有具有屬性 MyProperty、且其值為 "True" 的節點。 |
- Label.Contains("text") |
選取所有節點,但 Label 屬性中包含字串 (Contains) "text" 的節點除外。 |
+ Category.Is("MyCategory") |
選取所有具有 MyCategory 分類,或具有繼承自 MyCategory 之分類的節點。 |
動作是由已在 Visual Studio 中註冊的 DGML 資料提供者所提供,但您可以在儲存以 [架構總管] 建立的查詢時發現這些動作。 如需使用 [架構總管] 的詳細資訊,請參閱 HOW TO:使用架構總管尋找程式碼。
下表說明可對選取的節點執行之有向動作的範例:
範例動作 |
說明 |
---|---|
Microsoft.Contains |
傳回輸入節點所包含的所有節點。 您可以將 Contains 取代為不同的連結分類。 |
Microsoft.Open |
開啟輸入節點的原始程式碼。
注意事項
只能在 Visual Studio 中運作。
|
Microsoft.AllOutBoundLinks |
傳回所有從輸入節點連出至的目標節點。 |
Microsoft.AllInboundLinks |
傳回所有連入至輸入節點的來源端節點。 |
Microsoft.Core.CreateGroupsByProperties |
叫用 GroupByProperties 動作。 |
Microsoft.AllNodes |
傳回整個圖形中到目前為止的所有節點。 |
資料驅動型動作只會根據輸入節點與連結中的資料來選取項目。 在使用資料驅動型動作比對分類時,會納入繼承的分類。 下表說明資料驅動型動作的範例:
類型 |
說明 |
---|---|
Node:Both:Category |
傳回所有具有分類 Category,且與輸入節點有連結 (指向自己或指向輸入連結) 相連的節點。 |
Link:Both:Category |
傳回所有與輸入節點有連結 (指向自己或指向輸入連結) 相連,且具有分類 Category 的節點。 |
Link:Backward:Category |
傳回所有具有指向輸入節點的連結,且具有分類 Category 的節點。 |
Link:Forward:Category |
傳回所有具有從輸入節點指過來的連結,且具有分類 Category 的節點。 |
秘訣
一組輸入節點通常會有一個「預設」動作,由 [架構總管] 自動選取。 若要獲得相同的行為,請使用空白動作://
空白字元在 DGQL 中不具意義,因此必要時您可以將查詢全都寫在同一行。 使用 GraphCmd 加上 –exec 選項時,這將有所幫助。
偵錯 DGQL 時,使用 [架構總管] 中的動作 "Execute Expanded" 可讓您看見查詢的每個步驟,並查出未產生預期結果的步驟。
範例
下列 DGQL 陳述式會依照下列步驟中的說明執行查詢:
+ Id.Equals("Microsoft.Solution.ClassView") / "Microsoft.Solution.ClassView" / * / "Node:Both:CodeSchema_Class" / + CodeSchemaProperty_IsPublic.Equals("True")
首先,選取 [架構總管] 第一個資料行中的 [類別檢視] 節點。
執行動作 "Microsoft.Solution.ClassView",傳回方案中的所有命名空間。
使用 * 選取所有命名空間。
選取全部具有 CodeSchema_Class 分類且以連結與這些命名空間相關聯 (不論連結方向為何) 的節點。 這些通常會是內含項目連結。
將產生的類別篩選為只顯示具有屬性 CodeSchemaProperty_IsPublic="True" 的類別。
就技術上而言,動作 "Microsoft.Solution.ClassView" 因為是 [類別檢視] 節點的「預設」動作,所以並不必要。 因此,您可以將該動作取代為 // 以簡化查詢,並將查詢寫成單一一行,如下所示:
+Id.Equals("Microsoft.Solution.ClassView")//*/"Node:Both:CodeSchema_Class"/+CodeSchemaProperty_IsPublic.Equals("True")