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

本文关键字:DLL DllImport 属性 加载 | 更新日期: 2023-09-27 18:21:24

这个问题启发我提出了以下问题。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无论如何都会被加载吗?

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

正如MSDN所说:

定位和加载DLL,以及在内存中定位函数的地址,只发生在对函数的第一次调用时。

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

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

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只有在第一次调用时才加载。