.NET3.5アプリケーションで新しいUIスレッドを作成するための次のコードがあります。
private void OnCreateNewWindow(object sender, RoutedEventArgs e)
{
var rect = this.RestoreBounds;
double l = rect.Left;
double wth = rect.Width;
double t = rect.Top;
double ht = rect.Height;
var progressThread = new Thread(() =>
{
progressWindow = new ProgressWindow(Visibility.Collapsed) { Height = 50, Width = 50 };
progressWindow.WindowStartupLocation = WindowStartupLocation.Manual;
progressWindow.Left = l + (wth - progressWindow.Width) / 2;
progressWindow.Top = t - 35 + (ht - progressWindow.Height) / 2;
progressWindow.Show();
progressWindow.Activate();
Dispatcher.Run();
});
progressThread.SetApartmentState(ApartmentState.STA);
progressThread.Start();
}
クラッシュはここに示されています:
これは、32ビットバージョンのWindowsで完全に機能します。64ビットWindows7でPCを再起動したときにこのプログラムを初めて実行すると、Visual Studioを介して実行した場合、またはVisual Studioの外部でアプリケーションがクラッシュした場合に、null例外が発生します。
例外の詳細は乾燥しています:
System.NullReferenceException was unhandled
スタックトレースを以下に示します。
[Managed to Native Transition]
WindowsBase.dll!MS.Win32.HwndWrapper.DestroyWindow(object args) + 0xfc bytes
WindowsBase.dll!MS.Win32.HwndWrapper.Dispose(bool disposing, bool isHwndBeingDestroyed) + 0xce bytes
WindowsBase.dll!MS.Win32.HwndWrapper.Dispose() + 0x15 bytes
PresentationCore.dll!System.Windows.Media.MediaContextNotificationWindow.DisposeNotificationWindow() + 0x22 bytes
PresentationCore.dll!System.Windows.Media.MediaContext.Dispose() + 0xba bytes
[Native to Managed Transition]
[Managed to Native Transition]
WindowsBase.dll!System.Windows.Threading.Dispatcher.ShutdownImplInSecurityContext(object state) + 0x47 bytes
mscorlib.dll!System.Threading.ExecutionContext.runTryCode(object userData) + 0x178 bytes
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x62 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.ShutdownImpl() + 0x87 bytes
WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) + 0x121 bytes
> EMS.Controls.Dictionary.dll!EMS.Controls.Dictionary.Views.AuthenticateWindow.OnCreateNewWindow.AnonymousMethod() Line 56 + 0x5 bytes C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x9b bytes
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x4d bytes
プログラムを再度実行し続けると、プログラム互換性アシスタントから、いくつかの互換性設定が適用されたことを示すメッセージが表示されます。次回プログラムを実行すると、この例外は発生しなくなります。誰かがこれを経験しましたか?