我有一些代码
var aa = a();
b(aa);
调试时,我在b()
调用上设置了断点。然后转到即时窗口,我希望能够从项目中但尚未加载的 DLL 执行代码。说我想要一个新的Boo
并打电话给Foo()
.代码位于命名空间中,Baz
dll Spongle.dll
中。
当我打字时
>> new Baz.Boo().Foo(aa)
我收到错误:类型或命名空间名称"Baz"在此范围内无效。
如果我更改代码以使我的Boo
已经加载,它可以正常工作。
new Boo(); // dummy to ensure loading
var aa = a();
b(aa);
是否可以在调试期间从即时窗口加载 dll,以便我可以调用我的代码,尽管它已加载(尚未)?我可以将 new Boo()
用作应用程序主类的静态初始值设定项,但是在单元测试期间遇到了问题,因为它不一定涉及具有该静态初始值设定项的类。
虽然很重,但您当然可以使用反射来加载该测试的程序集。
以下方法不起作用:
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();
即时窗口之所以需要这种必要性,是因为当您的应用程序(在本例中为单元测试booscard应用程序)加载时,它会在整个代码中查找引用并加载所需的程序集以满足您的需求。 在您的情况下,代码中没有对程序集的显式引用,因此不会加载它。 即时窗口没有上下文,因此,您必须显式加载它。
若要以编程方式引用要加载的潜在程序集,可以使用已加载程序集的 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");