最近開発環境が壊れてきたのか、色々問題がでてきました。買い換えるか初期化して環境を構築し直すか検討している最中の話。

Problem

Windows10だとクラッシュすることなく動くのに、Windows7だと動かない。
でも、VisualStudioからデバッグ起動するとWindows7でも動くという不思議な問題。

例外として下記のメッセージをスローしていました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
System.Windows.Markup.XamlParseException: 'System.Windows.Window' のタイプ初期化子が例外をスローしました。 ---> System.TypeInitializationException: 'System.Windows.FrameworkElement' のタイプ初期化子が例外をスローしました。 ---> System.TypeInitializationException: 'System.Windows.Documents.TextElement' のタイプ初期化子が例外をスローしました。 ---> System.TypeInitializationException: 'MS.Internal.FontCache.Util' のタイプ初期化子が例外をスローしました。 ---> System.UriFormatException: 無効な URI: URI の形式を決定できませんでした。
場所 System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
場所 System.Uri..ctor(String uriString, UriKind uriKind)
場所 MS.Internal.FontCache.Util..cctor()
--- 内部例外スタック トレースの終わり ---
場所 MS.Internal.FontCache.Util.get_Dpi()
場所 System.Windows.SystemFonts.ConvertFontHeight(Int32 height)
場所 System.Windows.Documents.TextElement..cctor()
--- 内部例外スタック トレースの終わり ---
場所 System.Windows.FrameworkElement..cctor()
--- 内部例外スタック トレースの終わり ---
場所 System.Windows.Window..cctor()
--- 内部例外スタック トレースの終わり ---
場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
場所 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
場所 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
場所 System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
場所 System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
場所 System.Windows.Application.DoStartup()
場所 System.Windows.Application.<.ctor>b__1_0(Object unused)
場所 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
場所 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
場所 System.Windows.Threading.DispatcherOperation.InvokeImpl()
場所 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
場所 MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
場所 MS.Internal.CulturePreservingExecutionContext.Run(CulturePreservingExecutionContext executionContext, ContextCallback callback, Object state)
場所 System.Windows.Threading.DispatcherOperation.Invoke()
場所 System.Windows.Threading.Dispatcher.ProcessQueue()
場所 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
場所 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
場所 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
場所 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
場所 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
場所 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
場所 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
場所 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
場所 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
場所 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
場所 System.Windows.Application.RunDispatcher(Object ignore)
場所 System.Windows.Application.RunInternal(Window window)
場所 System.Windows.Application.Run(Window window)
場所 System.Windows.Application.Run()
場所 Harvester.WPF.App.Main() 場所 D:\Works\OpenSource\Harvester\Harvester.WPF\obj\Debug\App.g.cs:行 0

Resolution

FontCacheという単語が怪しいのでこれをキーにして検索しました。
そしたら見つかったのが下記のページ。

WPF window throws TypeInitializationException at start up UriFormatException thrown by MS.Internal.FontCache.Util

要するに、環境変数windirがないんじゃね?というもの

事実、環境変数がなくなっていました。/(^o^)\ナンテコッタイ
というか、環境変数PATHが異常に短い。そういえば、最近setxコマンド使用直後、setxコマンドが使えなくなる現象があったが、これが原因か。

色々調べると環境変数PATHが長すぎるのでは?という話がちらほら。
何かの拍子に、環境変数全体がカットされたのが原因なのだろう。

再起動したら直った。
うーん。

Conclusion

原因は判明しました。が、その原因を引き起こすトリガーが不明。
もう少し状況を注視します。