我不想通过代码动态加载库。
我想做以下事情:
//first assembly
public void Go()
{
//second assembly does not loaded yet
var s = new TestItem(); //at this point second assembly will be loaded before calling the constructor
}
//second assembly
public class TestItem
{
public TestItem()
{
}
}
即。我想仅在调用其程序集中的成员时才加载引用的库。可能吗?如果有可能 - 我该怎么做?
答案 0 :(得分:3)
正如Damien_The_Unbeliever已经在注释中指出的那样,无论何时使用它的类型,程序集都会动态加载。根据类型的使用位置,这会在加载Type(Properties,Fields,MethodParameters ...)或调用方法(局部变量,静态调用)时发生。
在你的例子中,如果你真的想根据一个条件加载另一个程序集,我建议把它放在另一个方法中。这样,只有在调用GoDeep()
时才会加载另一个程序集。
//first assembly
public void Go()
{
if (condition)
GoDeep();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void GoDeep()
{
var s = new TestItem(); //at this point second assembly will be loaded
}
有趣的事实:这就是在应用程序启动时没有抛出FileNotFoundExceptions
的原因,但有时可能在几天之后用户最终点击了一个使用了丢失文件的按钮。
编辑:为了确保该方法未在发布中内联,这是为JIT添加的。我想补充一下,我根本不会使用这种方法,因为它至少可以说有风险并且可能导致应用程序失败。