【问题标题】:Is the DllImport attribute always loading the unmanaged DLLDllImport 属性是否总是加载非托管 DLL
【发布时间】:2012-01-26 11:51:04
【问题描述】:

这个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 吗?

【问题讨论】:

  • 如果你把它改成[DllImport("kernel99.dll")]会怎么样?假设您当然没有其中之一。如果没有错误,我猜它没有尝试加载它。

标签: c# .net


【解决方案1】:

正如MSDN 所说:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2014-03-08
      相关资源
      最近更新 更多