是始终加载非托管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无论如何都会被加载吗?
正如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只有在第一次调用时才加载。