こんにちは、やまぱんです。
Hyper-Vの「クイック作成」を実行した際、以下のようなエラーが発生しました。
備忘録的にメモしておきます。
(解決はしましたが、何が原因でこうなったかはよくわかりません。)
ファイルまたはアセンブリ'NewtonsoftJson,Version=12.0.0.0,Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'、またはその依存関係の1つが読み込めませんでした。見つかったアセンプリのマニフェスト定義はアセンプリ参照に一致しません。(HRESULT からの例外:0x80131040)
このエラーは、Hyper-Vが内部で使用するNewtonsoft.Jsonライブラリ(バージョン12.0.0.0)が正しく参照できないことが原因でした。本記事では、この問題を解消するために行ったトラブルシューティングと解決方法を共有します。
Contents
エラーの調査手順
1.現在のGACに登録されているアセンブリを確認: 以下のPowerShellコマンドを使用して、システムで利用されているNewtonsoft.Jsonのバージョンを確認しました。
-
PowerShell コマンド
[System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.FullName -like "*Newtonsoft.Json*" } | Select-Object FullName, Location
- 結果
FullName Location Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed C:\Program Files\PowerShell\7\Newtonsoft.Json.dll
バージョン13.0.0.0が利用されており、Hyper-Vが要求するバージョン12.0.0.0が見つかりませんでした。
2.0 GAC内のアセンブリ検索: GAC全体を検索し、登録されているNewtonsoft.Jsonの情報を確認しました。
- PowerShell コマンド
Get-ChildItem -Path "C:\Windows\assembly\GAC_MSIL" -Recurse | Where-Object { $_.Name -like "*Newtonsoft.Json*" }
- 結果
Directory: C:\Windows\assembly\GAC_MSIL\HyperV-UX-UI-NewtonsoftJson
Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
GACにはバージョン13.0.0.0のみが登録されており、Hyper-Vが必要とするバージョン12.0.0.0が見つかりませんでした。
解決方法
- 必要なDLLの取得
Hyper-Vの動作に必要なNewtonsoft.Json.dll(バージョン12.0.0.0)を適切に入手します。
DLLのダウンロード:
- Newtonsoft.Json Github から該当バージョン(12.0.0.1)を取得。
https://github.com/JamesNK/Newtonsoft.Json/releases - ダウンロードしたファイルの名前はJson120r1.zip。
ファイルを解凍:
解凍後、以下のパスに必要なDLLを確認:
Json120r1\Bin\net20\Newtonsoft.Json.dll
バージョンの確認:
[System.Reflection.AssemblyName]::GetAssemblyName("C:\Users\XXXXXX\Json120r1\Bin\net20\Newtonsoft.Json.dll").Version
GACにDLLを登録
取得したNewtonsoft.Json.dll(バージョン12.0.0.1)をGACに登録します。
- PowerShell コマンド
# GAC用フォルダを作成 New-Item -ItemType Directory -Path "C:\Windows\assembly\GAC_MSIL\Newtonsoft.Json\12.0.0.0__30ad4fe6b2a6aeed"
# DLLをコピー Copy-Item -Path "C:\Users\XXXXX\Downloads\Json120r1\Bin\net20\Newtonsoft.Json.dll" -Destination "C:\Windows\assembly\GAC_MSIL\Newtonsoft.Json\12.0.0.0__30ad4fe6b2a6aeed"
# アクセス権を付与 icacls "C:\Windows\assembly\GAC_MSIL\Newtonsoft.Json\12.0.0.0__30ad4fe6b2a6aeed" /grant administrators:F
Hyper-Vテンプレートのリセット
テンプレートやキャッシュが破損している可能性があるため、以下のコマンドでリセットを実行しました。
- PowerShell コマンド
Remove-Item -Path "$env:ProgramData\Microsoft\Windows\Hyper-V\Virtual Machines\Quick Create" -Recurse -Force
結果
これらの手順を実施した後、Hyper-Vの「クイック作成」が正常に動作するようになりました。エラーは解消され、求めていた環境が無事に作成できました。
GAC とは
GAC(Global Assembly Cache) は、Windowsの.NET Frameworkで使用される特殊なフォルダで、共有アセンブリ(DLL)をシステム全体で一元管理するための仕組みです。
GACは、.NETアプリケーションが特定のバージョンのアセンブリ(DLL)を参照しやすくするために設計されており、以下のような特徴があります。
GACの格納場所
GACは、Windowsの特殊なシステムフォルダに存在します。以下はGACの主なディレクトリです:
-
GACディレクトリ(Windowsの場合):
通常の.NETアセンブリ: C:\Windows\assembly - MSIL(中間言語)形式のアセンブリ(.NET Framework 2.0以降):C:\Windows\assembly\GAC_MSIL
まとめ
-
原因:
Hyper-Vが参照するNewtonsoft.Jsonライブラリのバージョン12.0.0.0がGACに登録されていなかったこと。 -
対策:
必要なDLL(12.0.0.0)を入手してGACに登録。
テンプレートやキャッシュのリセットで環境を整備。 - 学び:
Hyper-Vが依存するライブラリのバージョン管理が重要であること。
GACの利用方法とPowerShellでの調査手法を理解。
もし同じ問題に直面した方がいれば、この手順が役立てば幸いです!