-
Notifications
You must be signed in to change notification settings - Fork 0
MS_DLL
nishi_74322014 edited this page Aug 21, 2026
·
1 revision
- 戻る(コンポーネント技術)
補足(本ページの位置付け): 本ページも**リンク集(ハブ)**である。
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開発
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。