初心者が迷ったNuGet Packageのバージョンを下げたらapp.configを掃除しなければイケナイという話
かずき大先生にお願いして、新しいバージョンをリリースしていただきました。
新しいメソッドの使用例は、私の過去のブログの記事をご覧ください。
今回は、アセンブリのBinding Redirectの話です。
さて、ReactiveProperty 2.5のリリース前に
「ソースコードを変更したので見てください」
というコメントをいただいたので、pre版あるかな?と
NuGet Packageの設定を「Stable Only」から「Include prerelease」へ変更
してしまいました。
実際には、Githubのブランチの修正だけだったのですが、設定をそのままにしてしまいました。
その後、新しいバージョンのお知らせを受けて、Update Allとしてしまったのですが、
Reactive Extensions 2.3-beta2が入ったので、UninstallしてStableを入れ直し
ました。
すると、ビルドは通るのですが、
実行時にUserControlのインスタンス作成に失敗
します。
System.Windows.Markup.XamlParseException occurred _HResult=-2146233087 _message='指定されたバインディング制約に一致する型 'MyReactivePropertyControls.Views.CalculatorControl' のコンストラクターの呼び出しで例外がスローされました。' 行番号 '8'、行位置 '10'。 HResult=-2146233087 IsTransient=false Message='指定されたバインディング制約に一致する型 'MyReactivePropertyControls.Views.CalculatorControl' のコンストラクターの呼び出しで例外がスローされました。' 行番号 '8'、行位置 '10'。 Source=PresentationFramework LineNumber=8 LinePosition=10 StackTrace: 場所 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri) InnerException: System.IO.FileNotFoundException _HResult=-2147024894 _message=ファイルまたはアセンブリ 'System.Reactive.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 HResult=-2147024894 IsTransient=false Message=ファイルまたはアセンブリ 'System.Reactive.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 Source=MyReactivePropertyControls FileName=System.Reactive.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 FusionLog="" StackTrace: 場所 MyReactivePropertyControls.Models.CalculatorModel..ctor() 場所 MyReactivePropertyControls.Views.CalculatorControl..ctor() 場所 c:\Projects\MySamples\MyReactivePropertyControls\MyReactivePropertyControls\Views\CalculatorControl.xaml.cs:行 37 InnerException: System.IO.FileNotFoundException _HResult=-2147024894 _message=ファイルまたはアセンブリ 'System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 HResult=-2147024894 IsTransient=false Message=ファイルまたはアセンブリ 'System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。 FileName=System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 FusionLog==== 事前バインド状態情報 === ログ: DisplayName = System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (Fully-specified) ログ: Appbase = file:///C:/Projects/MySamples/MyReactivePropertyControls/MyReactivePropertyControlTest/bin/Debug/ ログ: Initial PrivatePath = NULL 呼び出しているアセンブリ: MyReactivePropertyControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null === ログ: このバインドは default の読み込みコンテキストで開始します。 ログ: アプリケーション構成ファイル C:\Projects\MySamples\MyReactivePropertyControls\MyReactivePropertyControlTest\bin\Debug\MyReactivePropertyControlTest.vshost.exe.config を使用します。 ログ: ホスト構成ファイル を使用します。 ログ: C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config からのコンピューター構成ファイルを使用します。 ログ: アプリケーション構成ファイルにリダイレクトが見つかりました。2.2.5.0 は 2.3.0.0 にリダイレクトされました。 ログ: ポリシー後の参照: System.Reactive.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 ログ: 新しい URL file:///C:/Projects/MySamples/MyReactivePropertyControls/MyReactivePropertyControlTest/bin/Debug/System.Reactive.Core.DLL をダウンロードしようとしています。 ログ: 新しい URL file:///C:/Projects/MySamples/MyReactivePropertyControls/MyReactivePropertyControlTest/bin/Debug/System.Reactive.Core/System.Reactive.Core.DLL をダウンロードしようとしています。 ログ: 新しい URL file:///C:/Projects/MySamples/MyReactivePropertyControls/MyReactivePropertyControlTest/bin/Debug/System.Reactive.Core.EXE をダウンロードしようとしています。 ログ: 新しい URL file:///C:/Projects/MySamples/MyReactivePropertyControls/MyReactivePropertyControlTest/bin/Debug/System.Reactive.Core/System.Reactive.Core.EXE をダウンロードしようとしています。
良く見ると、
Reactive Extensionsのファイルがテストアプリのフォルダにコピーされていません。
そこで、思い出したのがこちらの記事。
何が起こっているのか調べてみようと思いました。
2> Unified Dependency "System.Reactive.Core, Version=2.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35". 2> Using this version instead of original version "2.2.5.0" in "C:\Projects\MySamples\MyReactivePropertyControls\MyReactivePropertyControls\bin\Debug\MyReactivePropertyControls.dll" because of a binding redirect entry in the file "App.config". 2> Using this version instead of original version "2.2.5.0" in "C:\Projects\MySamples\MyReactivePropertyControls\MyReactivePropertyControls\bin\Debug\ReactiveProperty.dll" because of a binding redirect entry in the file "App.config".
バージョンコントロール見たら、
- コントロールのプロジェクトにapp.configが追加
- テストアプリのapp.configも上書き
されていました。
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Reactive.Interfaces" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.3.0.0" newVersion="2.3.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Reactive.Core" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.3.0.0" newVersion="2.3.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Reactive.Linq" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.3.0.0" newVersion="2.3.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
runtime以下を削除したら無事解決。
NuGetトラブったら、
- packages.configチェック
- リポジトリチェック
- 参照設定チェック
- アンインストール
- ダメなら上記をマニュアル修正
- そしてapp.config
2016/02/08 追記
参照記事は、NuGet Packageに問題がある場合の話なので、早合点して作者に通報する人もいるかもしれませんが、先ずは自分側に問題が無いかをちゃんと調べようねという例でした。