4

我能够放置断点并检查加载了“Assembly.LoadFile”的 .NET dll 的变量,但是,出于某种原因,通用列表的可视化工具没有显示任何元素(如下所示)。当我将鼠标悬停在变量上时,监视窗口中显示的内容相同。

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

调试动态加载的程序集

在 Visual Studio .NET 中调试动态加载的程序集

我将 pdb 与 dll 并排放置(从它加载的确切位置)。我还将那个 dll 的 pdb 文件放在正在加载的可执行文件旁边,但仍然没有骰子。我正在调试中编译,并将所有配置设置为 x86。需要注意的一点是,如果我实际上将添加 dll 作为参考,调试可视化器会完美显示(但是,这是一个插件架构,exe 不应该依赖于 dll)。

有任何想法吗?

[编辑]

事实证明,我不能只是将插件添加为参考,我必须在我的 exe 中实际实例化该类型的列表,然后才能正确显示,不确定发生了什么......

[编辑]

我制作了这个展示行为的示例项目。我使用了与加载插件类似的代码(尽管很有趣,只是直接调用 Assembly.LoadFile 并通过反射调用方法似乎不会导致这种行为。我在这里压缩了示例项目:(其他人得到结果一样?)

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

[编辑]

另一个有趣的发展!我在 exe 旁边有一个 Plugins 文件夹,所有的 dll 都在其中。目前,我将插件 dll/pdb 复制到 exe 目录和 Plugins 子目录中。如果我使用 Assembly.LoadFile 并使用 Plugins 目录中的 dll,我将丢失我自己类型的列表可视化工具。如果我在 exe 旁边加载 dll,它可以工作,但为什么呢?

我所看到的:

在此处输入图像描述

4

3 回答 3

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”,然后Unwrap() 它返回它),但显然不是。

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

于 2012-04-28T22:00:48.097 回答
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))));
}
于 2012-04-28T03:06:24.617 回答
0

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

于 2012-04-28T11:11:06.037 回答