本文记录 WPF 应用程序,因为系统的颜色配置 Mscms.dll 组件损坏导致应用加载图片失败,从而启动失败的原因和解决方法

在 WPF 应用加载图片时,将会调用到系统的 Mscms.dll 组件。刚好我遇到一个用户的设备上,他的 Mscms.dll 是损坏的,在 C:\Windows\SysWOW64\ 文件夹里面的 Mscms.dll 是 x64 的,于是在 WPF 加载将会抛出如下异常

System.Windows.Markup.XamlParseException: 初始化“System.Windows.Media.Imaging.BitmapImage”时引发了异常。
 ---> System.BadImageFormatException: 试图加载格式不正确的程序。 (0x8007000B)
   at MS.Win32.PresentationCore.UnsafeNativeMethods.Mscms.OpenColorProfile(PROFILE& pProfile, UInt32 dwDesiredAccess, UInt32 dwShareMode, UInt32 dwCreationMode)
   at System.Windows.Media.ColorContext.FromRawBytes(Byte[] data, Int32 dataLength, Boolean dontThrowException)
   at System.Windows.Media.ColorContext..ctor(SafeMILHandle colorContextHandle)
   at System.Windows.Media.ColorContext.GetColorContextsHelper(GetColorContextsDelegate getColorContexts)
   at System.Windows.Media.Imaging.BitmapFrameDecode.get_ColorContexts()
   at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
   at System.Windows.Media.Imaging.BitmapImage.EndInit()
   at MS.Internal.Xaml.Runtime.ClrObjectRuntime.InitializationGuard(XamlType xamlType, Object obj, Boolean begin)
   --- End of inner exception stack trace ---
   at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
   at System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
   at System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
   at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
   at Lindexi.Demo.MainWindow.InitializeComponent()
   at Lindexi.Demo.MainWindow..ctor()

修复方法是去下载对应系统版本的 Mscms.dll 进行替换。我从 https://www.dll-files.com/mscms.dll.html 里找到对应的版本,也就是 Win10 对应 Win10 的,而 Win7 对应 Win7 的,对 32 位的对应 32 位,对 64 位的对应 64 位,下载解压缩,放在对应的文件夹里面。如 32 位的放在 C:\Windows\SysWOW64\ 文件夹,如 64 位的放在 C:\Windows\System32\ 文件夹里面,替换原有文件即可

另外的可能由于 Mscms.dll 颜色配置导致起不来的,是在系统的颜色配置里面设置很诡异,解决方法是还原到默认。设置的入口还请自行搜 配置显示器颜色配置文件 的方法,此方式也可以修复 WPF 界面打不开提示 System.ArithmeticException Overflow or underflow in the arithmetic operation 异常


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/WPF-%E7%94%B1%E4%BA%8E%E7%B3%BB%E7%BB%9F%E9%A2%9C%E8%89%B2%E9%85%8D%E7%BD%AE-Mscms-%E7%BB%84%E4%BB%B6%E6%8D%9F%E5%9D%8F%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

微软最具价值专家


无盈利,不卖课,做纯粹的技术博客

以下是广告时间

推荐关注 Edi.Wang 的公众号

欢迎进入 Eleven 老师组建的 .NET 社区

以上广告全是友情推广,无盈利