我能够为装有'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,它可以工作,但为什么呢?
我所看到的:
答案 0 :(得分:1)
解决方案A:
解决方案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;常规,向下滚动并确保未选中“在变量窗口中显示对象的原始结构”。