ReactiveProperty + VS2019でのデザイナ動作

経緯

.Net Framework 依存のプロジェクトがあったんで、WPF + .Net Framework 4.7.2 + ReactivePropertyの構成で作っていたら、途中からデザイナが表示されなくなってきました。 といってもデザイナがうまく表示されなくなるのはWPF(というかXAML系全般)であるあるだと思っているので、あまり気にせずやっていた……ものの、なんか法則がある気がしたので現象が起きるケースを調べてみました。

現象

環境

  • Visual Studio 16.6.1
  • ReactiveProperty.WPF 7.1.0

エラー

ハンドルされない例外が発生しました。
System.Runtime.Remoting.RemotingException
[11340] デザイナー プロセスが予期せず終了しました!

が発生してデザイナが表示されなくなります。再読み込みなどすると下記のようなエラーになることも。

System.ArgumentNullException
値を Null にすることはできません。
パラメーター名:remoteValues
   場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Remoting.LocalNotifyingEnumerable`2..ctor(IRemoteNotifyingEnumerable`1 remoteValues, Func`2 converter)
   場所 Microsoft.VisualStudio.DesignTools.DesignerContract.Isolation.Remoting.LocalDesignerView.Microsoft.VisualStudio.DesignTools.DesignerContract.IDesignerView.get_RelatedDocumentPaths()
   場所 Microsoft.VisualStudio.DesignTools.DesignerContract.IsolatedDesignerService.IsolatedDesignerView.CreateDesignerViewInfo(CancellationToken cancelToken)

発生条件

DataContextを指定しつつ、コントロールに構造体のReactiveProperyのValueをバインドすると発生。

※Thicknessなんかでも現象が発生したので、構造体であることがトリガーではないかとあたりをつけています。

View

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17


<Window x:Class="WpfApp1.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:WpfApp1"
        d:DataContext="{d:DesignInstance local:MainWindowViewModel}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock Text="{Binding Dt.Value}"/>
    </Grid>
</Window>


ViewModel

1
2
3
4
5

public class MainWindowViewModel
{
    public ReactiveProperty<DateTime> Dt { get; } = new ReactiveProperty<DateTime>();
}

回避策

IsDesignTimeCreatableをTrueにすると基本的に発生しなくなる。ただし確実ではないようで、コード量の問題か他に関連しているものがあるのかダメなものもありました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17


<Window x:Class="WpfApp1.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:WpfApp1"
        d:DataContext="{d:DesignInstance local:MainWindowViewModel,IsDesignTimeCreatable=True}"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock Text="{Binding Dt.Value}"/>
    </Grid>
</Window>


もう一つの回避策として、

  • Bindingしている箇所をコメントアウト
  • デザイナで表示させる
  • ビルドする
  • コメントアウトを戻す

でも回避可能。 ※ただしVisual Studio を再起動すると再びエラーになる。

根本的な回避策は.Net Coreを使用すること。こちらではエラーになりませんでした。

まとめ

エラーのトリガーとなっているのはReactiveProperty だと思うんですが、ビルドが通ること・一度表示されれば(Visual Studioを再起動しない限りは)うまくいくことを考えるとエラーの原因自体はVisual Studioのデザイナ側にある気がします。 といっても、原因が何にせよ個別に修正が入ることを期待するより、一番の対応は.Net Coreを採用することでしょう。 いつまでも.Net Frameworkではうまくいかないことがありますよ!時代は.Net Coreなんです!という事例でした。