簡體   English   中英

在運行時加載的程序集中沒有Generic.List的調試可視化工具

[英]No debug visualizer for Generic.List in runtime loaded assembly

我可以為加載了“Assembly.LoadFile”的.NET dll放置斷點並檢查變量,但是,由於某種原因,Generic List的可視化器不顯示任何元素(如下所示)。 當我將鼠標懸停在變量上時,在監視窗口中顯示相同的內容。

我已經檢查了這些不同的解決方案,但似乎沒有一個工作(它們似乎主要處理甚至無法調試dll):

調試動態加載程序集

在Visual Studio .NET中調試動態加載的程序集

我把pdb與dll並排(從它加載的確切位置)。 我還把那個dll的pdb文件放在正在進行加載的可執行文件旁邊,但仍然沒有骰子。 我在Debug中編譯,並已將所有配置設置為x86。 有一點需要注意,如果我實際上將dll添加為Reference,則調試可視化工具會完美顯示(但是,這是一個插件架構,並且exe不應該依賴於dll)。

有任何想法嗎?

[編輯]

事實證明,我不能只是添加插件作為參考,我必須在我的exe中實際實例化該類型的List才能正確顯示,不確定發生了什么...

[編輯]

我做了這個展示行為的示例項目。 我使用類似的代碼來加載插件(雖然有趣的是,直接調用Assembly.LoadFile並通過反射調用方法似乎不會導致行為。我在這里壓縮了示例項目:(其他人是否得到了相同的結果?)

http://dl.dropbox.com/u/64502227/PluginLoader.zip

[編輯]

又有趣的發展! 我在exe旁邊有一個Plugins文件夾,所有dll都在這里。 目前,我正在將插件dll / pdb復制到exe目錄和Plugins子目錄中。 如果我使用Assembly.LoadFile並在Plugins目錄中使用dll,我將丟失我自己類型的List可視化工具。 如果我在exe旁邊加載dll,它可以工作,但為什么呢?

我所看到的:

在此輸入圖像描述

解決方案A:

  • 從exe目錄加載所有dll而不是它們自己的目錄。

解決方案B:

使用它來創建插件:

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.FullName, "SamplePlugin.MyPlugin").Unwrap();

而不是這個:

Plugin plugin = (Plugin)Activator.CreateInstance(assembly.GetType("SamplePlugin.MyPlugin"));

我想第二行代碼實際上只是在內部被第一行代碼調用(例如,第一行必須按名稱查找程序集,然后從中找到類型“SamplePlugin.MyPlugin”,然后展開()它返回它),但顯然不是。

不幸的是,這是解決問題的方法,但它沒有回答為什么會發生這種情況。 如果有人知道,我仍然會非常感謝這些信息。

您始終可以使用即時窗口並執行:

string.Join("\r\n", roots);

或者長版本,包括索引:

string.Join("\r\n", items.Select((index, item) =>
                string.Format("{0}: {1}", index, item)));

或者具有完全相同的全局函數,因此它的使用將更漂亮,例如:

Print(roots);

和:

public static void Print<T>(IEnumerable<T> items)
{
    Debug.WriteLine(string.Join("\r\n", items.Select((index, item) =>
                        string.Format("{0}: {1}", index, item))));
}

驗證其中一個VS選項:工具 - >選項 - >調試 - >常規,向下滾動並確保未選中“在變量窗口中顯示對象的原始結構”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM