Share via


對應相依性圖形上整個程式碼的相依性

當您要了解程式碼之間的相依性時,請使用 Visual Studio Ultimate 加以對應。 當您想要了解所有程式碼之間的相依性時,請建立 Code Map 來將其視覺化 (僅限 Visual Studio Ultimate)。 這可協助您查看程式碼如何搭配運用,而無須閱讀所有檔案和程式碼行。

包含所選項目和已展開群組的圖形

部分影片如下:

以下是您需要的項目:

  • Visual Studio Ultimate 2013

  • 方案或組件 (.dll 或 .exe) 中的 Visual C# .NET 或 Visual Basic .NET 程式碼

  • Visual C++ 專案、標頭檔 (.h 或 #include) 或二進位檔案中的原生或 Managed C 或 C++ 程式碼

  • 對應相依性依據的 Visual Studio 2013 Update 3

    • 跨多個應用程式共用程式碼的專案

    • 由 .NET 模組製作的 Microsoft Dynamics AX X++ 專案和組件

    您也可以將組件和二進位檔案從 Windows 檔案總管拖曳至現有圖形,並取得色彩編碼關聯性。

從這裡開始:

  • 若要查看方案間整體相依性,請移至 [架構] 功能表。 依序按一下 [產生相依性圖形] 和 [針對方案]。

    -或-

  • 若要查看您方案中的特定相依性,請開啟 [方案總管]。 選取您感興趣的專案、組件參考、資料夾、檔案、類型或成員。 在 [方案總管] 工具列上,按一下 [建立新的圖形文件] [從所有選取的節點建立新的圖形文件] 按鈕

您也可以:

  • 查看 C 或 C++ 原始程式檔與標頭檔之間的相依性

  • 共用相依性圖形

  • 以程式設計方式建立圖形

查看整體相依性

查看方案中的相依性

  1. 在 [架構] 功能表上,依序按一下 [產生相依性圖形] 和 [針對方案]。

    即可取得顯示最上層組件和其彙總連結的圖形。 彙總連結愈廣,代表的相依性就愈高。 [外部] 群組中含有在您的方案之外的任何項目,包括平台相依性。 外部組件只會顯示所使用的項目。

    組件的最上層相依性圖形

  2. 若要查看組件內部,請將其展開。 將滑鼠指標移至組件上方,然後按一下出現的 ^ 符號 (鍵盤:選取項目,然後按 PLUS 鍵 (+))。若要瀏覽更深層的程式碼,請為命名空間、類型和成員執行相同的作業。

    包含已分組之節點的相依性圖形

    內含項目關聯性預設會顯示為「群組」(group),您可將其展開及摺疊。 若要以連結形式查看群組關聯性,請依序按一下圖形捷徑功能表上的 [群組] 和 [關閉群組]。

    包含已分組之節點和連結的相依性圖形

  3. 若要檢查彙總連結代表的項目和相依性,請先選取連結,然後開啟其捷徑功能表。 依序按一下 [顯示]、[目前圖表中的參與連結] 或 [新增圖表中的參與連結]。

    Visual Studio 會展開在連結兩端的群組,並只顯示參與此連結的項目和相依性。

  4. 若要取得項目或連結的詳細資訊,請將指標移到項目頂端,直到出現工具提示。 這會顯示連結所代表的分類。

  5. 若要查看連結色彩所代表的意義,請按一下圖形工具列上的 [圖例]。

    如果看到綠色連結,可能不表示只有繼承關聯性。 也有可能是方法呼叫,但是繼承關聯性將其隱藏。

  6. 若要查看跨群組中各成員之間的相依性,請按一下圖形上的項目。

    包含所選項目和已展開群組的圖形

  7. 若要找出程式碼中的潛在問題,請執行分析器

請參閱:

查看跨組件或二進位檔案的相依性

  • 建立空白圖形,或開啟現有圖形 (.dgml 檔案)。 從 Visual Studio 外部,將組件或二進位檔拖曳至圖形。

    注意事項注意事項

    只要您是以相同的使用者存取控制 (UAC) 權限等級執行 [Windows 檔案總管] 與 Visual Studio,就可以從 [Windows 檔案總管] 拖曳組件或二進位檔。例如,如果 UAC 已開啟,而您是以系統管理員身分執行 Visual Studio,那麼 [Windows 檔案總管] 將會封鎖拖曳作業。若要解決這個問題,請以系統管理員身分執行 Visual Studio,或關閉 UAC。請注意,在 Windows 8 中,[Windows 檔案總管] 是 [檔案總管]。

建立空白圖形

  1. 在 [方案總管] 中,開啟最上層方案節點的捷徑功能表。 依序按一下 [加入] 和 [新增項目]。

  2. 在 [已安裝] 下,按一下 [一般]。

  3. 在右窗格中,按一下 [有向圖形文件]。

    現在即有一個空白圖形,出現在您方案的 [方案項目] 資料夾中。

    若要開啟新的空白圖形,而不加入到您的方案中,請依序按一下 [檔案] 功能表上的 [新增] 和 [檔案]。

    若要將空白圖形加入模型專案,請開啟 [架構] 功能表,並按一下 [新增圖表]。

問與答

問:為何建立圖形需要的時間很長?

**答:**當您第一次產生圖形時,Visual Studio 會為所有找到的相依性編製索引。 此程序可能需要一些時間 (尤其是大型方案),但這可以改善之後的效能。 如果程式碼變更,則 Visual Studio 只會重新編製更新過的程式碼索引。 如果您不想等待圖形完成,可以隨時取消此步驟,並改試下列作業:

  • 只繪出您感興趣的相依性。

  • 在您產生整個方案的圖形前,請減少方案範圍。

雖然 Visual Studio 可以使用 1 GB 的記憶體來執行,但建議您的電腦至少要有 2 GB 的記憶體,以免在 Visual Studio 建立程式碼索引並產生圖形時延遲過於冗長。

當專案項目的 [複製到輸出目錄] 屬性設定為 [永遠複製] 時,可能需要更多時間從 [方案總管] 中建立圖形或將項目加入至圖形。 這可能會導致累加建置問題,而且會使 Visual Studio 每次都重新建置專案。 若要增加效能,請將這個屬性變更為 [有更新時才複製] 或 PreserveNewest。 請參閱 累加建置

問:Visual Studio 為何不建立我的圖形?

**答:**發生原因可能是未順利建置方案中的任何專案。 如果至少有一個專案建置成功,Visual Studio 就會產生圖形。 圖形只會顯示成功建置之程式碼的相依性。 如果某些元件發生建置錯誤,則圖形上會出現那些錯誤。 在根據圖形進行架構決策前,請確定元件可實際建置且具有相依性。

查看特定相依性

例如,假設您有要在出現暫止變更的某些檔案中,執行程式碼檢閱。 若要查看這些變更中的相依性,請從那些檔案建立相依性圖形。

包含已分組之節點的相依性圖形

查看方案中的特定相依性

  1. 開啟 [方案總管]。 選取您感興趣的專案、組件參考、資料夾、檔案、類型和成員。

  2. 繪製您的項目及其成員的圖形。 在 [方案總管] 工具列上,按一下 [建立新的圖形文件] [從所有選取的節點建立新的圖形文件] 按鈕

    若要尋找與類型或成員相依的項目,請在 [方案總管] 中開啟類型或成員的捷徑功能表。 按一下相依性類型。 然後選取結果。

    顯示特定程式碼的方式

    若要包括父階層與您的項目,請在 [方案總管] 工具列上開啟 [建立新的圖形文件] 清單。 按一下 [新增含有上階的相依性圖形]。

    顯示特定程式碼及父代的方式

    您也可以將項目拖曳至空白圖形或現有圖形。 若要建立空白的圖形,請依序按一下 [檔案] 功能表上的 [新增]、[檔案] 和 [有向圖形文件]。 若要包含項目的父階層架構,拖曳項目時請按住 [CTRL] 鍵。

    注意事項注意事項

    當您從跨多個應用程式 (如 Windows Phone 或 Windows 市集) 共用的專案中加入項目時,這些項目會與目前作用中的應用程式專案出現在對應上。如果您將內容變更為其他應用程式專案,並且從共用專案加入更多項目,這些項目現在會與新的作用中應用程式專案一起顯示。您使用對應中項目執行的作業僅適用於共用相同內容的項目。

  3. 若要瀏覽項目,請將其展開。 將滑鼠指標移至項目上方,然後按一下出現的 ^ 符號按鈕。 若要展開所有項目,請開啟圖形的捷徑功能表。 依序按一下 [群組] 和 [全部展開]。

    注意事項注意事項

    如果展開所有群組會發生無法使用的圖形或記憶體問題,則不會提供此選項。

  4. 若要查看出現在程式碼中但不出現在圖形上的成員,請按一下 [重新擷取子系] 重新擷取子系圖示。 這些群組成員會以不同的樣式顯示,讓您更容易看清楚成員。 請參閱 編輯和自訂相依性圖形

  5. 若要查看更多與圖形上項目相關的項目,請開啟該項目的捷徑功能表。 按一下 [顯示] 以及您感興趣的關聯性類型。

    若是組件,請按一下:

    參考的組件

    加入這個組件參考的組件。 外部組件會出現在 [外部] 群組中。

    參考組件

    從參考這個組件的方案中加入組件。

    若是類別,請按一下:

    基底類型

    對於類別,加入基底類別和實作的介面。

    對於介面,加入基底介面。

    衍生類型

    對於類別,加入衍生類別。

    對於介面,加入衍生介面和實作類別或結構。

    所有基底類型

    以遞迴方式加入基底類別或介面階層架構。

    所有衍生類型

    對於類別,以遞迴方式加入所有衍生類別。

    對於介面,以遞迴方式加入所有衍生介面和實作類別或結構。

    內含項目階層

    加入父容器階層架構。

    使用的類型

    加入這個類別使用的所有類別和其成員。

    Used-By 類型

    加入使用這個類別的所有類別及其成員。

    若是方法,請按一下:

    內含項目階層

    加入父容器階層架構。

    被呼叫方法

    加入這個方法呼叫的方法。

    呼叫來源方法

    加入呼叫這個方法的方法。

    基底類型中的覆寫方法

    對於覆寫其他方法或實作介面方法的方法,加入所覆寫之基底類別中的所有抽象或虛擬方法,以及所實作之介面的方法 (若有的話)。

    被參考欄位

    加入這個方法所參考的欄位。

    若是欄位,請按一下:

    內含項目階層

    加入父容器階層架構。

    參考方法

    加入參考此欄位的方法。

查看組件或二進位檔案中的特定相依性

  1. 在 [架構] 功能表上,依序按一下 [Windows] 和 [架構總管]。

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

  3. 在 [開啟] 方塊中尋找組件或二進位檔,並加以選取。 按一下 [開啟],將它們加入 [架構總管] 中的下一個資料行。

  4. 在下一個資料行中,選取組件或二進位檔。

    根據預設,下一個資料行會顯示所選項目包含的項目。

    提示

    若要選取其他相關項目,請在包含您所選項目的資料行右邊,展開摺疊的資料行。在 [節點巡覽] 底下,選取您有興趣的項目種類。在 [對外巡覽] 或 [對內巡覽] 底下,選擇您有興趣的關聯性種類。請參閱 使用架構總管尋找程式碼

  5. 尋找您要放置在圖形中的所有項目並加以選取。

  6. 若要建立新的圖形,請按一下 [架構總管] 工具列上的 [從所有選取的節點建立新的圖形文件] [從所有選取的節點建立新的圖形文件] 按鈕

    -或-

    要將所選項目加入到圖形中,請依照下列步驟執行:

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

    2. 在 [架構總管] 工具列上,按一下 [將所有選取的節點加入到目前的可見圖形文件] 將所有選取的節點加入至圖形按鈕

      -或-

      將項目從 [架構總管] 拖曳至圖形。

查看 C 與 C++ 原始程式檔與標頭檔之間的相依性

如果要為 C++ 專案建立更完整的圖形,請在這些專案上設定瀏覽資訊編譯器選項 (/FR)。 請參閱 /FR、/Fr (建立 .Sbr 檔案)。 否則會出現訊息並提示您設定此選項。 如果選取 [確定],則只會為目前的圖形設定這個選項。 您可以選擇隱藏所有之後圖形的訊息。 如果隱藏這個訊息,之後可以讓它再次出現。 請將下列登錄機碼設定為 0,或刪除該機碼:

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\NativeProvider : AutoEnableSbr

當您開啟包含 Visual C++ 專案的方案時,更新 IntelliSense 資料庫可能需要一些時間。 此時,您可能無法建立標頭 (.h 或 #include) 檔案的相依性圖形,直到 IntelliSense 資料庫完成更新。 您可以在 Visual Studio 狀態列中監視更新進度。 若要解決因為某些 IntelliSense 設定停用而發生的問題或訊息,請參閱 C 和 C++ 程式碼圖形疑難排解。

  • 若要查看方案中所有原始程式檔與標頭檔之間的相依性,請依序按一下 [架構] 功能表上的 [產生相依性圖形] 和 [針對 Include 檔]。

    機器碼相依性圖形

  • 若要查看目前開啟的檔案與相關原始程式檔和標頭檔之間的相依性,請開啟原始程式檔或標頭檔。 在檔案內的任意處開啟檔案捷徑功能表。 按一下 [產生 Include 檔圖形]。

    .h 檔案的第一層相依性圖形

C 和 C++ 程式碼圖形疑難排解

C 和 C++ 程式碼不支援下列項目:

  • 基底類型不會出現在包含父代階層架構的圖形中。

  • 大部分的 [顯示] 功能表項目無法供 C 和 C++ 程式碼使用。

建立 C 和 C++ 程式碼的相依性圖形時,可能會發生下列問題:

問題

可能的原因

解決方式

無法產生相依性圖形。

方案中沒有成功建立的專案。

修正發生的建置錯誤,然後重新產生圖形。

當您嘗試從 [架構] 功能表產生相依性圖形時,Visual Studio 會變得反應遲緩。

程式資料庫 (.pdb) 檔案可能會損毀。

.pdb 檔案會儲存偵錯資訊,例如類型、方法和原始程式檔資訊。

重建方案後再試一次。

IntelliSense 瀏覽資料庫的某些設定已停用。

某些 IntelliSense 設定可能已在 Visual Studio [選項] 對話方塊中停用。

開啟這些設定來加以啟用。

請參閱 進階、C/C++、文字編輯器、選項

[未知方法] 訊息出現在方法節點上。

發生這個問題是因為無法解析方法的名稱。

二進位檔可能沒有基底重新配置表格。

在連結器中開啟 /FIXED:NO 選項。

請參閱 /FIXED (固定基底位址)

程式資料庫 (.pdb) 檔案可能無法建置。

.pdb 檔案會儲存偵錯資訊,例如類型、方法和原始程式檔資訊。

在連結器中開啟 /DEBUG 選項。

請參閱 /DEBUG (產生偵錯資訊)

無法在預期的位置中開啟或找到 .pdb 檔案。

請確定預期的位置中有 .pdb 檔案存在。

已從 .pdb 檔案中移除偵錯資訊。

如果在連結器中使用 /PDBSTRIPED 選項,請改為包含完整的 .pdb 檔案。

請參閱 /PDBSTRIPPED (移除專用符號)

呼叫端不是函式,而且為二進位檔案中的 Thunk 或資料區段中的指標。

當呼叫端為 Thunk 時,請嘗試使用 _declspec(dllimport) 來避免 Thunk。

請參閱:

共用相依性圖形

與其他 Visual Studio 使用者共用圖形

  • 使用 [檔案] 功能表以儲存圖形。

    -或-

    若要將圖形儲存為特定專案的一部分,請開啟圖形表面的捷徑功能表。 按一下 [將 <DependencyGraphName.dgml> 移入] ,以及儲存圖形的專案。

    Visual Studio 會將圖形儲存為 .dgml 檔案,讓您可以和其他 Visual Studio Ultimate、Visual Studio Premium 和 Visual Studio Professional 的使用者共用。

    注意事項注意事項

    在您與 Visual Studio Premium 及 Visual Studio Professional 使用者共用圖形之前,請展開所有群組,顯示隱藏的節點和跨群組連結,並擷取任何您希望其他人在圖形看到的已刪除節點。否則,其他使用者就無法看到這些項目。

    若您儲存的圖形是位於模型專案中,或此圖形是從模型專案複製到另一個位置,就會發生下列錯誤:

    「無法將 fileName 儲存在專案目錄外。不支援連結項目。」

    Visual Studio 顯示錯誤,不過還是會建立儲存的版本。若要避免此錯誤,請將圖形建立在模型專案之外。然後您可以將它儲存到您想要的位置。只將檔案複製到方案中的另一個位置然後再嘗試儲存,這種做法不會有用。

將圖形匯出為影像,因此您可以將它複製到其他應用程式,例如 Microsoft Word 文件或 PowerPoint

  1. 開啟圖形介面的捷徑功能表。 依序按一下 [編輯] 和 [複製影像]。

  2. 將影像貼入另一個應用程式中。

將圖形匯出為 XPS 檔案,如此您就可以在類似 Internet Explorer 的 XAML 或 XML 檢視器中查看

  1. 開啟圖形介面的捷徑功能表。 按一下 [另存為 XPS]。

  2. 瀏覽至儲存檔案的位置。

  3. 爲圖形命名。 將 [存檔類型] 方塊設定為 [XPS 檔 (*.xps)]。 按一下 [儲存]。

以程式設計方式建立圖形

若要建立圖形文件 (.dgml 檔案) 以在批次處理期間工作,請執行 GraphCmd.exe 命令列工具。 例如,若要找出不同建置之間已變更的相依性,請在每次建置之後執行此工具。 若要尋找此工具,請查看此資料夾:C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE。

GraphCmd.exe 只支援 .NET 程式碼,並且只針對組件或 .dgml 檔案 (而不是 Visual Studio 方案或專案檔中的原始程式碼) 產生相依性資訊。 由於 GraphCmd.exe 是在 Visual Studio 以外執行,因此對 DGQL 查詢中的動作的支援有限。

以下是 GraphCmd.exe 的語法:

GraphCmd -? -all -exceptions -input File_Name -query File_Name -exec "DGQL_Statement" -output File_Name -path alias=path

以下是 GraphCmd.exe 的選項:

您可以指定多次下列選項:-input-query-exec-path

-?

顯示 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\..."

請參閱常用路徑的別名。

常用路徑的別名

常用路徑的別名有助於縮減 .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 檔案,請參閱 編輯和自訂相依性圖形

深入了解有向圖形查詢語言 (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 之分類的節點。

下表說明可對選取的節點執行之有向動作的範例:

範例動作

描述

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")

我還可以做什麼?

哪裡可以取得詳細資訊?

分類

連結

論壇

網誌