如何在VS2013中调试期间加载dll

Car*_*ngo 6 c# dll dllimport visual-studio dll-injection

我有一些代码

var aa = a();
b(aa);
Run Code Online (Sandbox Code Playgroud)

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

当我输入

>> new Baz.Boo().Foo(aa)
Run Code Online (Sandbox Code Playgroud)

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

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

new Boo(); // dummy to ensure loading
var aa = a();
b(aa);
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*d L 4

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

以下内容将不起作用:

var obj = new Newtonsoft.Json.Linq.JObject();
Run Code Online (Sandbox Code Playgroud)

因为大会尚未出席。但是,如果我首先通过反射和垃圾箱的绝对路径显式加载它,我就可以很好地实例化该对象。

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

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

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