2012-04-28 97 views
4

我能够把断点并检查了载有“Assembly.LoadFile”一个.NET的DLL的变量,但是,出于某种原因对泛型列表可视化不无调试可视化工具Generic.List显示任何元素(如下所示)。在监视窗口中显示的内容与悬停在变量上时相同。在运行时加载的程序集

我已经研究过这些不同的解决方案,但没有一个似乎工作(这也似乎他们大多是应付甚至不能够调试DLL):

Debug dynamically loaded assembly

Debug dynamically loaded assembly in Visual Studio .NET

我把与dll并列的pdb(从它加载的确切位置)。我也将该dll的pdb文件放在正在执行加载的可执行文件旁边,并且仍然没有骰子。我在Debug中进行编译,并将所有配置都设置为x86。有一点需要注意,如果我真的把添加DLL作为一个参考,调试可视化完全显示出来(不过,这是一个插件架构,以及Exe不应该有在DLL中的依赖)。

任何想法?

[编辑]

事实证明,我不能只是添加插件作为一个参考,我已经实际实例化类型在我的exe文件的列表之前可以正常显示了,不知道这是怎么回事...

[编辑]

我做表现出的行为此示例项目。我使用类似的代码来加载插件(尽管有趣的是,直接调用Assembly.LoadFile并通过反射调用一个方法似乎不会导致行为。我在这里压缩了示例项目:(其他人是否获得了同样的结果?)

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

[编辑]

另一个有趣的发展!我旁边的EXE,这里所有的DLL去了。目前,我复制插件DLL中的Plugins文件夹/ PDB到两个exe文件目录,和插件子目录。如果我使用Assembly.LoadFile并在Plugins目录使用DLL,我失去了列表可视化我自己类型。如果我在exe旁边加载dll,它会起作用,但是为什么?

我看到:

enter image description here

+1

你能告诉我们你加载DLL和PDB代码? – Polity 2012-04-28 05:35:30

+1

@Polity我加入一个示例项目的链接显示出相同的行为:http://dl.dropbox.com/u/64502227/PluginLoader.zip – Trevor 2012-04-28 20:56:50

+0

的又一突破,如果我通过插件目录中加载和使用激活.CreateInstance并传入Type中,则失败。但是,如果我使用该行:Activator.CreateInstance(assembly.FullName,“SamplePlugin.MyPlugin”)。Unwrap(),它的工作原理。我认为关键是'Unwrap',但我不确定这是为调试器做了什么。另外,我更新了PluginLoader示例(更加简洁并清楚地概述了错误)。 – Trevor 2012-04-28 21:34:56

回答

1

解决方案A:

  • 负荷exe文件目录下的所有dll文件,而不是自己的目录。

解决方案B:

使用它来创建插件:

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

取而代之的是:

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

我会想出第二行o f代码实际上只是在内部被第一行代码调用(例如,第一行必须按名称查找程序集,然后从中找到类型“SamplePlugin.MyPlugin”,然后Unwrap()将其返回),但显然不是。

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

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

这会起作用,但以这种方式检查整个树会非常繁琐(每个节点都有一个子列表)。我正在寻找更多的答案,而不是工作,但谢谢。 – Trevor 2012-04-28 04:03:58

+0

您可以用您自己的类包裹它,只是为了调试的目的,看'新TreeWrapper(项目);' – SimpleVar 2012-04-28 04:04:54

+1

既然是有可能使用拉姆达在即时窗口什么时候?除此之外,调试可视化工具应该“正常”工作,这并没有真正回答 – Polity 2012-04-28 05:35:00

0

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

+0

这个问题确实没有被检查,但知道它存在很好。 – Trevor 2012-04-28 18:14:00

相关问题