VS2013调试时如何加载dll

Posted

技术标签:

【中文标题】VS2013调试时如何加载dll【英文标题】:How to load dll's during debug in VS2013 【发布时间】:2015-07-02 06:34:18 【问题描述】:

我有一些代码

var aa = a();
b(aa);

在调试时,我在b() 调用上设置了一个断点。然后转到即时窗口,我希望能够从我的项目中但尚未加载的 DLL 执行代码。假设我想要一个新的Boo 并致电Foo()。代码在 dll Spongle.dll 的命名空间 Baz 中。

当我输入时

>> new Baz.Boo().Foo(aa)

我收到错误:类型或命名空间名称“Baz”在此范围内无效。

如果我更改我的代码以使我的Boo 已经加载,它可以正常工作。

new Boo(); // dummy to ensure loading
var aa = a();
b(aa);

是否可以在调试期间从即时窗口加载 dll,以便我可以调用我的代码,尽管它已加载(尚未)?我可以使用new Boo() 作为我的应用程序主类的静态初始化程序,但是在单元测试期间我遇到了问题,因为它不一定会涉及带有该静态初始化程序的类。

【问题讨论】:

命名空间是Baz,不幸的是已经包含在我的问题中。 你一定忽略了一些东西,因为我从来没有遇到过你描述的问题。你能展示你的 Boo 类的完整定义吗? @Nathan A:获取您在应用程序中使用的任何 DLL,调试不使用该 dll 的单元测试,设置断点并尝试在即时窗口中从该 dll 实例化 为什么DLL还没有加载,是什么原因导致它被加载? @John 因为测试中没有代码使用问题中给出的它 【参考方案1】:

虽然很重,但您当然可以使用反射来加载该测试的程序集。

以下方法不起作用:

var obj = new Newtonsoft.Json.Linq.JObject();

因为该程序集尚未出现。但是,如果我首先通过反射和我的 bin 的绝对路径显式加载它,我可以很好地实例化该对象。

var assembly = System.Reflection.Assembly.LoadFile("C:\\AbsolutePath\\bin\\Debug\\Newtonsoft.Json.dll");
var obj = new Newtonsoft.Json.Linq.JObject();

立即窗口之所以如此必要,是因为当您的应用程序(或本例中的单元测试自举应用程序)加载时,它会在整个代码中查找引用并加载所需的程序集以满足您的需求。在您的情况下,您的代码中没有对程序集的显式引用,因此不会加载它。即时窗口没有上下文,因此,您必须显式加载它。

要以编程方式引用要加载的潜在程序集,您可以使用已加载程序集的 bin 目录。这允许您在运行时拉取绝对路径。

var filePath = new Uri(this.GetType().Assembly.CodeBase).LocalPath;
var bin = System.IO.Path.GetDirectoryName(filePath);
var assembly = System.Reflection.Assembly.LoadFile(bin + "\\Newtonsoft.Json.dll");

【讨论】:

VS中是否有变量指向构建路径或nuget包所在的nuget?这样就可以说System.Reflection.Assembly.LoadFile($nugetpath +"Newtonsoft.Json.dll") ? @CarloV.Dango 更新了我的答案。您不一定要引用 nuget 包源(特别是考虑到目前的结构预计会在 vNext 中发生变化)。也就是说,您可以从应用程序入口点的 bin 目录中拉取程序集。

以上是关于VS2013调试时如何加载dll的主要内容,如果未能解决你的问题,请参考以下文章

vs调试dll

Virtual Studio 2013 每次加载程序(dll)缓慢的问题

vs下如何调试Dll

寻找如何在 VS 9 中调试到导出的 dll 函数。可能吗?

vs调试没问题,iis发布浏览分析其错误,未能加载类型?很急,求大神。

在 VS 2010 中调试后丢失文件?