tmori3y2のブログ

主にWindowsのプログラムなど

初心者が迷ったNuGet Packageのバージョンを下げたらapp.configを掃除しなければイケナイという話

blog.okazuki.jp

かずき大先生にお願いして、新しいバージョンをリリースしていただきました。

新しいメソッドの使用例は、私の過去のブログの記事をご覧ください。

今回は、アセンブリの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のファイルがテストアプリのフォルダにコピーされていません。

そこで、思い出したのがこちらの記事。

何が起こっているのか調べてみようと思いました。

kendik.hatenablog.com

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に問題がある場合の話なので、早合点して作者に通報する人もいるかもしれませんが、先ずは自分側に問題が無いかをちゃんと調べようねという例でした。