Skip to content
nishi_74322014 edited this page Aug 21, 2026 · 1 revision

DLL

内部リンク

補足(本ページの位置付け): 本ページも**リンク集(ハブ)**である。
DLL そのものの要点を補っておく。

【DLL(Dynamic Link Library)とは】★
   ・実行時に読み込まれる【共有ライブラリ】
   ・複数のプロセスが【コードページを共有】できる
     → メモリ効率がよい
     → ただし【データは共有されない】(プロセスごとにコピー)
   ・拡張子は .dll だが、
     .ocx(ActiveX)/ .cpl(コントロール パネル)/
     .drv も実体は DLL

【静的リンクとの違い】
   静的リンク(.lib)
     → 実行ファイルに【取り込まれる】
     → 単体で動くが、修正時は再ビルドが要る
   動的リンク(.dll)
     → 実行時に解決される
     → 【DLL だけ差し替えられる】★
     → 代わりに「見つからない / 版が違う」が起きる
【DLL の 2 つの読み込み方】★
   ① 【暗黙的リンク】(Load-Time Dynamic Linking)
        → .lib(インポート ライブラリ)をリンクする
        → 起動時に OS が自動でロードする
        → 【無いと起動すらしない】
   ② 【明示的リンク】(Run-Time Dynamic Linking)
        → LoadLibrary + GetProcAddress
        → 【無くても起動できる】(機能を無効化する等)
        → プラグイン機構の基本形 ★

   .NET からは【P/Invoke(DllImport)】で呼ぶ
     → 内部的には明示的リンクに近い
     → 詳細は [マネージドコードとアンマネージドコードのブリッジ](MS_ManagedUnmanagedBridge)
【「DLL 地獄」(DLL Hell)】★
   ・同名 DLL の版が上書きされ、
     別のアプリが動かなくなる古典的な問題
   ・Windows 側の対策
       - 【Windows File Protection / WFP】(Windows 2000〜)
       - 【SxS(Side-by-Side アセンブリ)】★
         → WinSxS フォルダに複数版を共存させ、
           マニフェストで版を指定する
       - 【Private Assemblies】(exe と同じフォルダに置く)
   ・.NET 側の対策
       - アセンブリの【強い名前】とバージョン
       - アプリ ローカル配置(XCOPY)★
       - .NET Core 以降は【GAC そのものを廃止】した
【32bit / 64bit の壁】★
   ・64bit プロセスは【32bit DLL を読めない】(逆も同様)
   ・「BadImageFormatException」の典型原因
   → .NET 側は AnyCPU / x86 / x64 の
     プラットフォーム ターゲットを合わせる
   → 詳細は [64bit対応](MS_Support64bit) を参照
【セキュリティ:DLL 検索順序の悪用】★
   ・【DLL プリロード攻撃(DLL Hijacking)】
     → 検索パス上に悪意ある同名 DLL を置かれる
   ・対策
       - 【SetDefaultDllDirectories】で検索範囲を絞る
       - LoadLibraryEx に
         LOAD_LIBRARY_SEARCH_SYSTEM32 を指定する
       - 【絶対パスでロードする】★
       - DLL に【署名】する

Tags: 移行, Windows, プログラミング, .NET開発

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally