Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
こんにちは、Visual Studio サポート チームです。
今回は、特定の環境下で WPF アプリケーションの起動に失敗する現象についてお知らせいたします。
現象
特定の環境において WPF アプリケーションの起動に失敗する場合がある。
その際、以下のようなエラーが記録される。
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
場所 System.Windows.Automation.Peers.AutomationPeer.Initialize()
場所 System.Windows.Automation.Peers.AutomationPeer..ctor()
場所 System.Windows.Automation.Peers.UIElementAutomationPeer..ctor(UIElement owner)
場所 System.Windows.Automation.Peers.FrameworkElementAutomationPeer..ctor(FrameworkElement owner)
...
原因
本問題は、WPF の不具合に起因して発生します。
WPF アプリケーションのウィンドウ表示時の初期化処理で、static な ValuePatternIdentifiers クラスを使用する際、タイプイニシャライザによる初期化が開始されて ValuePatternIdentifiers クラス の各 static メンバが null 初期化されます。(初期化処理 A とします)
このタイプ イニシャライザの処理の中で、COM の初期化処理 (CoCreateInstance) が WM_GETOBJECT メッセージの送信を伴って実行されますが、ここで、WM_GETOBJECT メッセージが WPF の Dispatcher によってルーティングされ、AutomationPeer オブジェクトが生成されて初期化されます。
AutomationPeer オブジェクトの初期化処理では、ValuePatternIdentifiers.ValueProperty プロパティの初期化 (初期化処理 B とします) が行われますが、特定の環境下では、メッセージ処理のタイミングに依存して、初期化処理 B より先に初期化処理 A が完了して ValuePatternIdentifiers.ValueProperty が null 初期化された状態となり、これにより AutomationPeer オブジェクトの初期化に失敗し、COM の初期化処理に失敗するケースがあります。
対処策
本問題は、MainWindow の生成タイミングよりも前に、AutomationPeer.Initialize() を実行させることで回避可能です。
具体的には、以下のようなコードを追加し、ダミーのウインドウで AutomationPeer.Initialize を実行します。
<App.xaml.cs>
// App クラスのメンバ変数として Window オブジェクトを追加します。
public Window m_wnd;
// App クラスのコンストラクタで AutomationPeer.Initialize が実行されるように処理を追加します。
public App()
{
m_wnd = new Window();
WindowAutomationPeer peer = new WindowAutomationPeer(m_wnd); }
<MainWindow.xaml.cs>
public MainWindow()
{
InitializeComponent();
// メインウィンドウを明示的に設定します。
App.Current.MainWindow = this; }
// MainWindow の Closed 時などに、先に生成した Windwow をクローズします。
private void Window_Closed(object sender, EventArgs e)
{
WpfApplication1.App app = (WpfApplication1.App)App.Current;
app.m_wnd.Close(); }
※ 上記は .NET Framework 4 での例となります。
マイクロソフトではこの問題を製品の不具合と認識しておりますが、現状では、修正プログラムは提供されておりません。
本問題が発生する環境でアプリケーションを実行する必要がある場合は、お手数ですが、上述の対処策のご利用をご検討ください。
弊社製品の不具合でご迷惑をおかけいたしておりますこと、深くお詫び申し上げます。