如何在 VS2013 调试期间加载 dll

How to load dll's during debug in VS2013

我有一些代码

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

调试时,我在 b() 调用上设置了一个断点。然后转到 立即 window,我希望能够从我的项目 但尚未加载的 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);

是否可以在调试期间从直接 window 加载 dll,以便我可以调用我的代码,尽管它正在加载(尚未)?我可以将 new Boo() 用作我的应用程序主程序 class 的静态初始化程序,但是我在单元测试期间遇到问题,因为它不一定涉及 class 和该静态初始化程序。

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

以下将不起作用:

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();

Immediate Window 这种必要性的原因是,当您的应用程序(或本例中的单元测试助推应用程序)加载时,它会在整个代码中查找引用并加载所需的程序集以满足您的需求需要。在您的情况下,您的代码中没有对程序集的显式引用,因此不会加载它。直接 window 没有上下文,因此,您必须显式加载它。

要以编程方式引用要加载的潜在程序集,您可以使用已加载程序集的 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");