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 方案中查看原始程式碼的概觀

  1. 開啟方案。

  2. 指向 [架構] 功能表上的 [產生相依性圖形],然後執行下列其中一個步驟:

    按一下

    以產生圖形來顯示

    依組件

    所有由方案產生的組件之間的彙總相依性,以及這些組件所依賴的任何外部相依性。

    若要查看組件內部的命名空間、類別和方法,請展開圖形上的組件。 外部組件只會顯示正在使用中的項目。

    依命名空間

    方案中所有命名空間之間的彙總相依性,以及程式碼所依賴的任何外部命名空間。

    若要查看命名空間內部的類別和方法,請展開圖形上的命名空間。 外部命名空間只會顯示正在使用中的項目。

    依類別

    方案中所有類別之間的彙總相依性。 程式碼所使用之外部類別的相關資訊並不會顯示。

    -或-

    若要查看跨多種結構類型的相依性,請按一下 [自訂]。

    1. 在 [產生相依性圖形] 對話方塊中,至少按一下右列其中一個方塊:[組件]、[命名空間]、[型別] 或 [方法]。

    2. 使用下表篩選圖形:

      若要

      請執行這些步驟

      查看外部相依性的參考。

      這麼做對探索內部組件在外部組件上的建置方式相當有用。

      選取 [外部]

      僅查看具有特定存取層級的型別和方法。

      例如,您可能只要選取公用型別以簡化圖形。

      展開 [存取篩選] 窗格,然後選取您想要的層級。

      注意事項注意事項
      您至少必須選取一個型別存取層級。若要減少圖形上的相依性數目,請只針對方法選取您想要的存取層級。

      將內含項目關聯性顯示為巢狀群組,並將相依性顯示為彙總連結,以查看高階相依性。

      注意事項注意事項
      方法的相依性將會顯示為個別連結,而非彙總連結,因為方法是最下層分葉節點。

      選取 [將內含項目顯示為群組] 方塊。

      將內含項目關聯性顯示為連結的節點,並將相依性顯示為個別連結,以查看低階相依性。

      清除 [將內含項目顯示為群組] 方塊。

    3. 完成後,請按一下 [確定]。

      Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。

    彙總相依性連結的粗細指出有多少彙總相依性所表示的個別相依性。 若要查看連結所表示之相依性的種類,請將指標移至連結上方直到出現工具提示為止。

    注意事項注意事項

    您從 [架構] 功能表產生的相依性圖形,不會顯示對最具衍生性的型別所發出的虛擬方法呼叫。 它們會顯示的是宣告這些虛擬成員的型別上的相依性。 但您可以使用 [架構總管] 中的 [類別檢視] 尋找這些呼叫。 然後,您便可以將這些呼叫從 [架構總管] 拖曳至現有圖形,或是從 [架構總管] 工具列產生新的圖形。

在 Visual Studio 方案中查看原始程式碼中的特定相依性

使用 [架構總管],可讓您尋找要視覺化的程式碼和關聯性。 您也可以使用預先定義的查詢來產生圖形。

  1. 開啟方案。

  2. 如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。

  3. 在 [架構總管] 第一個資料行的 [Visual Studio] 底下,按下列其中一個檢視:

    • [類別檢視],探索程式碼的邏輯階層。

      用來瀏覽命名空間、型別、方法等項目。

    • [方案檢視],探索程式碼的實體階層。

      用來瀏覽專案、原始程式檔等項目。

  4. 在下一個資料行中,選取您想要探索的項目。 若要選取資料行中的所有項目,請按下 CTRL+A

    下一個資料行隨即根據該資料行項目及關聯性的預設種類,顯示與選取項目相關的項目。

    注意事項注意事項

    若要選取其他種類的項目及關聯性,請展開包含您所選項目之資料行右側的折疊資料行。 在 [節點巡覽] 底下,選取您想要的項目種類。 在 [對外巡覽] 或 [對內巡覽] 底下,選取您想要的關聯性種類。 如需詳細資訊,請參閱 HOW TO:使用架構總管尋找程式碼

  5. 重複執行步驟 4,直到您選取想要的所有項目為止。

    注意事項注意事項

    若要在圖形上包含 [呼叫] 相依性,請瀏覽至您選取之類別所呼叫的全部方法,並且選取這些方法。

  6. 若要從選取項目建立新圖形,請按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。

    Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。

    -或-

    若要將選取項目加入至現有圖形或空白圖形,請依照下列步驟執行:

    1. 開啟現有圖形的 .dgml 檔案,或建立空白圖形。

    2. 按一下 [架構總管] 標題列底下的 [將所有選取的節點加入到目前的可見圖形文件]。

      -或-

      將節點從 [架構總管] 拖曳至圖形。

建立空白圖形

  1. 若要開啟空白圖形,請指向 [檔案] 功能表上的 [新增],然後按一下 [檔案]。

    -或-

    若要將空白圖形加入至 [方案項目] 資料夾,請以滑鼠右鍵按一下 [方案總管] 中最上層的方案節點,然後按一下 [加入新項目]。

  2. 在 [已安裝的範本] 底下,按一下 [一般]。

  3. 在右窗格中,按一下 [有向圖形文件]、指定圖形名稱,然後按一下 [加入]。

如需各種與圖形進行互動之方式的詳細資訊,請按一下空白圖形上出現的說明連結。

使用預先定義的查詢瀏覽原始程式碼

  1. 開啟方案。

  2. 如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。

  3. 在 [架構總管] 第一個資料行的 [已儲存的 DGQL 查詢] 底下,按一下 [在資料夾中]。

  4. 在下一個資料行中,依據您要建立的圖形種類,按下列其中一個查詢:

    若要產生圖形以顯示

    請按一下

    方案參考的所有組件。

    您可以從查詢結果產生顯示這些組件間相依性的圖形。

    All Assembly References.dgql

    在方案中所有輸出組件的一般清單,不含相依性連結。

    All Output Assemblies.dgql

    若要為選取的組件產生標準相依性圖形,請依照下列步驟執行:

    1. 在下一個資料行中,選取您想要的組件。

    2. 在目前資料行的右側,按一下摺疊的動作資料行加以展開。

      注意事項注意事項
      當您將指標移至動作欄上方時,它就會反白顯示。
    3. 在動作欄的 [命令] 底下,按一下 [標準圖形]。

    方案中的所有專案。

    您可以從查詢結果產生顯示這些專案間交互參考的圖形。

    All Project References.dgql

    在方案中所有專案的一般清單。

    如果您的方案包含方案資料夾,這份清單將與您在 [架構總管] 中按一下 [方案檢視] 時出現的清單不同。

    All Projects.dgql

    方案中的所有型別。

    您可以從查詢結果產生顯示這些型別間繼承關係的圖形。

    Inheritance Graph.dgql

    下一個資料行會將結果顯示為一般清單。 雖然連結可能存在於這些節點之間,但不會在 [架構總管] 中出現。

  5. 若要為結果資料行中的所有項目產生圖形 (包括連結),請依照下列步驟執行:

    1. 在結果資料行中按 CTRL+A,選取所有項目。

    2. 按住 CTRL 鍵不放,只將圖形上目前資料行中的項目納入,然後按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。

      Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。

查看已編譯程式碼的概觀

  1. 建立空白圖形,或開啟現有圖形的 .dgml 檔案。

  2. 從 Visual Studio 外面將 .dll 檔或 .exe 檔拖曳至圖形。

    注意事項注意事項

    不支援從 [方案總管] 中的 [參考] 資料夾進行拖曳。 只要您是以相同的使用者存取控制 (UAC) 權限等級執行 [Windows 檔案總管] 與 Visual Studio,就可以從 [Windows 檔案總管] 拖曳組件。 例如,如果 UAC 已開啟,而您是以系統管理員身分執行 Visual Studio,那麼 [Windows 檔案總管] 將會封鎖拖曳作業。 若要解決這個問題,您可以關閉 UAC 或使用預先定義的查詢來探索方案。

查看已編譯程式碼中的特定相依性

  1. 如果沒有開啟 [架構總管],請在 [架構] 功能表上,指向 [視窗],然後按一下 [架構總管]。

  2. 在第一個資料行中的 [檔案系統] 底下,按一下 [選取檔案]。

  3. 在 [開啟] 方塊中,瀏覽至 .dll 檔或 .exe 檔,再選取並開啟這些檔案。

  4. 選取下一個資料行中的組件。 若要選取資料行中的所有項目,請按下 CTRL+A

    下一個資料行隨即根據該資料行項目及關聯性的預設種類,顯示與選取項目相關的項目。

    注意事項注意事項

    若要選取其他種類的項目及關聯性,請展開包含您所選項目之資料行右側的折疊資料行。 當您將指標移至動作欄上方時,它就會反白顯示。 在 [節點巡覽] 底下,選取您想要的項目種類。 在 [對外巡覽] 或 [對內巡覽] 底下,選取您想要的關聯性種類。 如需詳細資訊,請參閱 HOW TO:使用架構總管尋找程式碼

  5. 選擇下列其中一項:

    若要從下列項目建立相依性圖形

    請依照下列步驟:

    組件

    1. 在包含組件之資料行的右側,按一下摺疊的動作資料行加以展開。

      當您將指標移至動作欄上方時,它就會反白顯示。

    2. 在動作欄的 [命令] 底下,按一下 [標準圖形]。

    物件和方法

    1. 瀏覽類別和方法,並選取您要在圖形中包含的所有項目。

    2. 若要建立新圖形,請按一下 [架構總管] 標題列底下的 [從所有選取的節點建立新的圖形文件]。

      Visual Studio 會建立有向圖形文件 (.dgml 檔) 並開啟它。

      -或-

      若要將選取項目加入至現有圖形或空白圖形,請依照下列步驟執行:

      1. 開啟現有圖形的 .dgml 檔案,或建立空白圖形。

      2. 按一下 [架構總管] 標題列底下的 [將所有選取的節點加入到目前的可見圖形文件]。

        -或-

        將節點從 [架構總管] 拖曳至圖形。

產生批次處理的圖形文件

若要以批次模式產生圖形文件 (.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 -output MyGeneratedGraph.dgml -path "MyPathAlias=C:\Program Files\..."

如需詳細資訊,請參閱常用路徑的別名。

備註

由於 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")
  1. 首先,選取 [架構總管] 第一個資料行中的 [類別檢視] 節點。

  2. 執行動作 "Microsoft.Solution.ClassView",傳回方案中的所有命名空間。 

  3. 使用 * 選取所有命名空間。

  4. 選取全部具有 CodeSchema_Class 分類且以連結與這些命名空間相關聯 (不論連結方向為何) 的節點。 這些通常會是內含項目連結。

  5. 將產生的類別篩選為只顯示具有屬性 CodeSchemaProperty_IsPublic="True" 的類別。

就技術上而言,動作 "Microsoft.Solution.ClassView" 因為是 [類別檢視] 節點的「預設」動作,所以並不必要。 因此,您可以將該動作取代為 // 以簡化查詢,並將查詢寫成單一一行,如下所示:

+Id.Equals("Microsoft.Solution.ClassView")//*/"Node:Both:CodeSchema_Class"/+CodeSchemaProperty_IsPublic.Equals("True")

請參閱

工作

HOW TO:儲存、共用和匯出圖形文件

概念

視覺化現有的程式碼

其他資源

HOW TO:使用相依性圖形探索程式碼

HOW TO:瀏覽和巡覽圖形文件

HOW TO:編輯和自訂圖形文件