Windows 7環境におけるAero2テーマのロードエラー

あるGUIツールを開発しており、同僚からWindows 7環境でインターフェースが正常に表示されないという報告を受けました。 調査の結果、ビューの初期化プロセス中にPresentationFramework.Aero2がロードできないことが判明し、以下の例外が発生していました:

{System.BadImageFormatException: ファイルまたはアセンブリ 'PresentationFramework.Aero2, PublicKeyToken=31bf3856ad364e35' またはその依存関係をロードできませんでした。実行コンテキストで参照アセンブリをロードすることはできません。Reflection-onlyローダーコンテキストでのみロードできます。 (HRESULTからの例外: 0x80131058)
ファイル名: 'PresentationFramework.Aero2, PublicKeyToken=31bf3856ad364e35' ---> System.BadImageFormatException: 実行用の参照アセンブリをロードできません。
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
   System.Reflection.Assembly.Load(AssemblyName assemblyRef)
   System.Windows.Baml2006.Baml2006SchemaContext.ResolveAssembly(BamlAssembly bamlAssembly)
   System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlTypeToType(BamlType bamlType)
   System.Windows.Baml2006.Baml2006SchemaContext.ResolveBamlType(BamlType bamlType, Int16 typeId)
   System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType(Int16 typeId)
   System.Windows.Baml2006.Baml2006Reader.Process_ElementStart()
   System.Windows.Baml2006.Baml2006Reader.Process_OneBamlRecord()
   System.Windows.Baml2006.Baml2006Reader.Process_BamlRecords()
   System.Windows.Baml2006.Baml2006Reader.Read()
   System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
   System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)

コードを確認したところ、フォームでテーマライブラリを使用していることがわかりました:

xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2"

開発環境はWindows 10で、.NET Framework 4.8をターゲットとしていたため、このライブラリは正常に参照できていました。しかし、クライアントマシンには.NET Framework 4.8ランタイムがインストールされているにもかかわらず、Aero2ライブラリが見つからないことが判明しました。 クライアント環境に対応するため、開発環境のこのライブラリをbinディレクトリに配置することで、正常に参照できるようになりました。 関連情報を調べている際に、テーマの使用を諦めるという解決策も見つかりました。これは状況に応じて選択可能なアプローチです。

参考: https://www.cnblogs.com/dino623/p/Windows7-Using-Aero2.html https://learn.microsoft.com/en-us/archive/msdn-technet-forums/cee2efbb-f9ef-43b2-8ff2-a03b3dafe1d9

タグ: .NET Framework WPF Windows 7 テーマ 例外処理

5月26日 04:30 投稿