2012-01-26 7 views
6

このquestionは私に次の質問を促しました。 DllImport属性は、メソッドを呼び出す/使用していないときでも、常に特定のDLLを読み込みます。DllImport属性は常にアンマネージDLLをロードしていますか

たとえば次のコードがある場合:アプリケーションがAllocConsole開始された今

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(); 
     }   
    }   
} 

が解雇されることはありませんが、DLLがとにかくロードされますか? MSDNとして

+1

'[DllImport(" kernel99.dll ")]'に変更するとどうなりますか?もちろん、それらの1つを持っていないと仮定します。エラーがなければ、ロードしようとしなかったと思います。 – Blorgbeard

答えて

4

は言う:

位置決めとは、DLLをロードし、メモリ内の関数のアドレスを探し出すだけ関数の最初の呼び出し時に起こります。

ただし、属性に存在しないdllを指定することで簡単に確認できます。

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が最初に呼び出されたときにロードされるように見えます。

+0

+1チェックアウトのため。 –

関連する問題