DllImport属性是否始终加载非托管DLL

时间:2012-01-26 11:51:05

标签: c# .net

question激励我提出以下问题。即使您没有调用/使用该方法,DllImport属性是否始终加载特定的DLL。

例如,如果您有以下代码:

static class Program {

    [DllImport("kernel32.dll")]
    static extern bool AllocConsole();

    static void Main()
    {
        if (true)                                
        {
            //do some things, for example starting the service.
        }
        else 
        {
            AllocConsole();
        }           
     }        
 }

现在,当应用程序启动时,AllocConsole永远不会被激活但是dll是否会被加载?

2 个答案:

答案 0 :(得分:4)

正如MSDN所说:

  

定位并加载DLL,并在第一次调用该函数时,仅在内存中查找函数的地址。

但您可以通过在属性中指定不存在的dll来轻松验证这一点。

答案 1 :(得分:3)

我做了一点测试。以下程序运行良好:

static class Program {
    [DllImport("doesnotexist.dll")]
    static extern bool AllocConsole();
    static void Main() {
        if (false) AllocConsole();
    }        
}

以下程序在AllocConsole()行上引发DllNotFoundException。

static class Program {
    [DllImport("doesnotexist.dll")]
    static extern bool AllocConsole();
    static void Main() {
        if (true) AllocConsole();
    }        
}

所以看起来dll只在第一次调用时加载。