System.Windows.Markup.XamlParseException (System.MethodAccessException?)が起きてしまう

May 28, 2012 at 10:54 AM
Edited May 28, 2012 at 10:58 AM

いつもブログの方を拝見しております。

今回ReactivePropertyを初めて利用してみたのですが、試しに書いたコードが動きませんでした。小一時間調べてみたのですが、残念ながら力不足で原因を特定できませんでした。

さあやってみよう!と思った矢先、いきなり躓いてしまったので、どうかご教示頂きたいです。

こちらの記事(http://neue.cc/2011/10/07_346.html)を参考にさせて頂き、一番最初の時計のサンプルを作ろうとしてみました。(Silverlight 5のOOBで作成しました。)

【C#】

namespace ReactivePropertySampleOnSilverlight
{
	using System;
	using System.Reactive.Linq;
	using Codeplex.Reactive;

	public class MainPageViewModel
	{
		public ReactiveProperty<string> ClockTime { get; private set; }

		public MainPageViewModel()
		{
			ClockTime = Observable.Interval(TimeSpan.FromSeconds(1))
				.Select(_ => DateTime.Now.ToString())
				.ToReactiveProperty();
		}
	}
}
【XAML】
<UserControl 
	x:Class="ReactivePropertySampleOnSilverlight.MainPage"
	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"
	mc:Ignorable="d"
	xmlns:r="clr-namespace:Codeplex.Reactive;assembly=ReactiveProperty.SL5"
	xmlns:ri="clr-namespace:Codeplex.Reactive.Interactivity;assembly=ReactiveProperty.SL5"
	xmlns:rn="clr-namespace:Codeplex.Reactive.Notifiers;assembly=ReactiveProperty.SL5"
	xmlns:vm="clr-namespace:ReactivePropertySampleOnSilverlight"
	d:DesignHeight="300" d:DesignWidth="400">
	
	<UserControl.DataContext>
		<vm:MainPageViewModel/>
	</UserControl.DataContext>
	
	<Grid x:Name="LayoutRoot" Background="White">
		<TextBlock Text="{Binding ClockTime.Value}"/>
	</Grid>
</UserControl>


これだけで単純に動くことを期待していたのですが、 MainPageのInitializeComponent();の中で例外(System.Windows.Markup.XamlParseException)が発生してしまいます。
(System.MethodAccessExceptionが原因だと思うのですが...どのように直す必要があるのか見当がついていません)
MainPageViewModelのコンストラクタ内の処理をコメントアウトすると例外は発生せず、正常に動きます。中で何が起こっているのでしょうか?
May 28, 2012 at 11:18 AM

補足です。Silverlight 4で同様のコードを試してみたところ、正常に動作することを確認しました。

May 28, 2012 at 2:37 PM

以下の手順で回避できるようになりました。(仕組みをあまり理解していないので何が起こっているのかはわかっていません)

 

ソースコードをダウンロードしてObservableEx.csの142行目と145行目の[Conditional("CONTRACTS_FULL")]を削除してSL5のプロジェクトをビルド後、作成されたアセンブリを読み込むことで表示できるようになりました。 

(ソースコードをダウンロードしてSL5のプロジェクトを開き、ビルドして作成したアセンブリを使用したところ、Code Contractsを使ってこの手順を実行するか、直接プロジェクト上のCONTRACTS_FULLを削除するようにとのエラーメッセージが出て、それに従いました。)

 

#この投稿を書きながら再度同じ手順を踏んでみたのですが、 ソースコードをダウンロードしてSL5のプロジェクトを開き、ビルドして作成したアセンブリを使用しただけで正常な動作を確認しました。(何故...?)

また、CONTRACTS_FULLを削除するようにとのメッセージも表示する方法がわからなくなりました。


新規作成後のプロジェクトにNugetでReactivePropertyをインストールすると最初のエラーが出ることは確認できました。

May 28, 2012 at 2:40 PM
Edited May 28, 2012 at 2:41 PM

今回のエラーとは関係ありませんが、NugetでReactivePropertyをインストールするとSystem.Windows.Interactivityへの参照が含まれますが、参照のバージョンが4.0.5.0のため5.0.5.0を既に使用していると競合が起きることを確認しました。