OITA: Oika's Information Technological Activities

@oika 情報技術的活動日誌。

WPF 特定のリソースの組み合わせでビルドが通らなくなるバグ

よっぽど変な勘違いをしていなければ、VisualStudio(MSBuild?)のバグだと思われる話。
再現環境は.NET 4.0, VS2010のC# Express。
あと.NET 4.5, VS Express 2012のfor Desktopでもやっぱり再現した。

正常に動作していたコードで、唐突にビルドが通らなくなったのです。
MainWindowのクラスで、
「名前 'InitializeComponent' は現在のコンテキスト内に存在しません。」
そんなばかなと思ってobjフォルダを開いたら、
MainWindowのbamlファイルもg.csも生成されていなかった。

で、いろいろ試してみたら、どうもMainWindow.xamlの
Resoucesに指定した内容が原因らしいとわかった。

とりあえず最小の再現コードを載せてしまう。

<Window x:Class="MainWindowBamlLostSample.MainWindow"  
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
        xmlns:local="clr-namespace:MainWindowBamlLostSample"  
        Title="MainWindow" Height="350" Width="525">  
  
    <Window.Resources>  
        <local:Class1 x:Key="class1"/>  
        <x:Array Type="Brush" x:Key="array1" />  
      
    </Window.Resources>  
</Window>  

適当な自作クラスのオブジェクトと、
適当な型の配列オブジェクトを同時にリソースに入れると
突然ビルドが通らなくなる。

見つけられた限りではこの組み合わせだけで、
以下のような組み合わせでは全て問題なくビルドできた。

<SolidColorBrush x:Key="brush1"/>  
<x:Array Type="Brush" x:Key="array1" />  
<x:Array Type="Brush" x:Key="array1" />  
<x:Array Type="Brush" x:Key="array2" />  
<sys:String x:Key="str1" xmlns:sys="clr-namespace:System;assembly=mscorlib" />  
<x:Array Type="Brush" x:Key="array1" />  
<local:Class1 x:Key="class1"/>  
<SolidColorBrush x:Key="brush1"/>  

あるいはマークアップ拡張の使い方がまずかったりするんだろうか…。