よっぽど変な勘違いをしていなければ、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"/>
あるいはマークアップ拡張の使い方がまずかったりするんだろうか…。