在运行时加载的程序集中没有Generic.List的调试可视化工具

时间:2012-04-28 02:32:41

标签: c# visual-studio debugging assemblies

我能够为装有'Assembly.LoadFile'的.NET dll放置断点和检查变量,但是,由于某种原因,Generic List的可视化器不显示任何元素(如下所示)。当我将鼠标悬停在变量上时,观察窗口中会显示相同的内容。

我已经检查了这些不同的解决方案,但似乎没有一个解决方案(它们似乎也主要处理甚至无法调试dll):

Debug dynamically loaded assembly

Debug dynamically loaded assembly in 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,它可以工作,但为什么呢?

我所看到的:

enter image description here

3 个答案:

答案 0 :(得分:1)

解决方案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”它,然后展开()它返回它),但显然不是。

不幸的是,这是问题的解决方案,但它没有回答为什么会发生这种情况。如果有人知道,我仍然非常感谢这些信息。

答案 1 :(得分:0)

您可以随时使用即时窗口并执行:

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))));
}

答案 2 :(得分:0)

验证其中一个VS选项:工具 - &gt;选项 - &gt;调试 - &gt;常规,向下滚动并确保未选中“在变量窗口中显示对象的原始结构”。