ある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