我能够为加载了“Assembly.LoadFile”的 .NET dll 设置断点并检查变量,但是,出于某种原因,通用列表的可视化工具不显示任何元素(如下所示)。当我将鼠标悬停在变量上时,监 window 口中显示的内容相同。
我已经检查了这些不同的解决方案,但似乎没有一个有效(而且它们似乎主要处理甚至无法调试 dll):
Debug dynamically loaded assembly
Debug dynamically loaded assembly in Visual Studio .NET
我将 pdb 与 dll 并排放置(从它加载的确切位置)。我还将那个 dll 的 pdb 文件放在正在加载的可执行文件旁边,但仍然没有骰子。我正在调试中编译,并将所有配置设置为 x86。需要注意的一件事是,如果我实际上将添加 dll 作为引用,则调试可视化工具会完美显示(但是,这是一个插件架构,exe 不应该依赖于 dll)。
有什么想法吗?
[编辑]
事实证明我不能只将插件添加为引用,我必须在我的 exe 中实际实例化该类型的列表才能正确显示,不确定发生了什么...
[编辑]
我制作了这个展示行为的示例项目。我使用了与我加载插件的方式类似的代码(尽管很有趣,只是直接调用 Assembly.LoadFile 并通过反射调用方法似乎不会导致这种行为。我在这里压缩了示例项目:(其他人有没有得到结果相同?)
http://dl.dropbox.com/u/64502227/PluginLoader.zip
[编辑]
另一个有趣的发展!我在 exe 旁边有一个插件文件夹,所有的 dll 都放在那里。目前,我正在将插件 dll/pdb 复制到 exe 目录和 Plugins 子目录中。如果我使用 Assembly.LoadFile 并使用插件目录中的 dll,我将丢失我自己类型的列表可视化工具。如果我在 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”它,然后 Unwrap() 它返回它),但显然不是。
不幸的是,这是解决问题的办法,但它没有回答为什么会这样。如果有人知道,我仍然会非常感谢这些信息。
关于c# - 运行时加载的程序集中没有用于 Generic.List 的调试可视化工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360103/