コーヒー飲みながら仕事したい

仕事で使う技術的なことの備忘録とか


Wordpress に引っ越しました!

WPF で外部のプロジェクトからユーザーコントロールとかを参照する方法

移転しました。

地味にかなりハマったので、備忘録として残しておきます。

シチュエーションとしては、以下の感じです。

ここで、プロジェクトAの MainWindow にて最初は単純に以下のように記述していました。

<Window x:Class="ProjectA.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ProtobufAnalyzer.DebugWpf"
        xmlns:pb="clr-namespace:ProjectB"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <pb:MyUserCtrl>
        </pb:MyUserCtrl>
    </Grid>
</Window>

コンパイルすると以下のようにコンパイルエラーになります。

error MC3074: タグ 'MyUserCtrl' は、XML 名前空間 'clr-namespace:ProjectB' にありません。

ちゃんと xmlns:pb="clr-namespace:ProjectB" というように名前空間を追加しているのに!
名前空間 ProjectBMyUserCtrl はあるのに!
間違いなくプロジェクトBの参照にプロジェクトAを追加しているのに!

どうしろというのだ・・・

ググってもググり方が悪いのか、特に有力な情報は得られず・・・
30分以上格闘して、自分が作った過去の wpf アプリのソースを見ていたら解決策が見つかりました。(というか、過去のアプリは無意識のうちに?ちゃんとできてました)

結果的には、以下のように名前空間の後に assembly=*** を追加しなければならないようです。

<Window x:Class="ProjectA.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ProtobufAnalyzer.DebugWpf"
        xmlns:pb="clr-namespace:ProjectB;assembly=ProjectB"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <pb:MyUserCtrl>
        </pb:MyUserCtrl>
    </Grid>
</Window>

こんなんわかるわけないやん・・・
せめてエラーとかもうちょっと直感的にわかるようなやつが出てくれれば・・・
と恨み節ですが。