有没有办法强制应用程序在运行时加载引用?

时间:2016-04-13 10:03:34

标签: c#

我不想通过代码动态加载库。

我想做以下事情:

//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()
    {

    }
}

即。我想仅在调用其程序集中的成员时才加载引用的库。可能吗?如果有可能 - 我该怎么做?

1 个答案:

答案 0 :(得分:3)

正如Damien_The_Unbeliever已经在注释中指出的那样,无论何时使用它的类型,程序集都会动态加载。根据类型的使用位置,这会在加载Type(Properties,Fields,MethodParameters ...)或调用方法(局部变量,静态调用)时发生。

在你的例子中,如果你真的想根据一个条件加载另一个程序集,我建议把它放在另一个方法中。这样,只有在调用GoDeep()时才会加载另一个程序集。

//first assembly
public void Go()
{
    if (condition)
        GoDeep();
}
[MethodImpl(Met‌​hodImplOptions.NoInlining)]
private void GoDeep()
{
    var s = new TestItem(); //at this point second assembly will be loaded 
}

有趣的事实:这就是在应用程序启动时没有抛出FileNotFoundExceptions的原因,但有时可能在几天之后用户最终点击了一个使用了丢失文件的按钮。

编辑:为了确保该方法未在发布中内联,这是为JIT添加的。我想补充一下,我根本不会使用这种方法,因为它至少可以说有风险并且可能导致应用程序失败。