web-dev-qa-db-ja.com

VS 2017を使用している場合、Assembly FSharp.Core 4.4.1.0への依存関係を解決できません

VS 2015とF#4.0(4.4.0.0)でかなり長い間開発を続けてきました。

VS 2017のリリースでは、開発作業用に最新のVSでソリューションを開きたいと思いますが、しばらくはプロジェクトをVS 2015、F#4.0、.NET 4.5.2のままにしておきます。ビルドサーバーもしばらくVS 2015を使用する必要があります。

私が覚えている限りでは、この種のシナリオは以前のVSバージョンのアップグレードでは問題ありませんでしたが、そのときF#を使用したとは思いません。

ソリューションを開き、コンパイルしようとしました。 C#アプリケーションプロジェクトでこのエラーが発生します。 (他のC#アプリケーションがあり、少なくとも1つはF#ライブラリを参照します。)

不明なビルドエラー、「アセンブリ 'FSharp.Core、Version = 4.4.1.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a」への依存関係を解決できません。プリロードされていないため、ReflectionOnly APIを使用する場合、依存アセンブリはプリロードまたはReflectionOnlyAssemblyResolveイベントを通じてオンデマンドでロードされます。

ソリューション内のすべてのF#プロジェクトは4.0(4.4.0.0)です。再確認しました。

なんでこんなことが起こっているの?

25
Bent Tranberg

「4.4.1.0」を検索したところ、C#プロジェクトの「obj」フォルダーにapp.configとは異なる.exe.configファイルがあることがわかりました。この追加情報は、プロジェクトのapp.configにはありませんでした。

<runtime>
...
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.1.0" />
      </dependentAssembly>
    </assemblyBinding>

なぜこれが自動的に追加され、なぜこの特定のC#プロジェクトでのみ追加されるのですか?

そのセクションをプロジェクトのapp.configにコピーし、両方の場所で4.4.0.0に変更しようとしましたが、うまくいきませんでした。また、古いバージョンの上限として「4.4.1.0」を使用し、新しいバージョンとして「4.4.0.0」を使用しようとしましたが、それでも動作しませんでした。同じコンパイラエラー。

次に、そのセクションを削除し、C#プロジェクトでFSharp.Core 4.4.0.0を参照しました。それはついにコンパイルエラーを取り除きました。

私はプログラムを実行しました。この例外でクラッシュしました。

未処理の例外:ファイルまたはアセンブリ 'FSharp.Core、Version = 4.4.1.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a'またはその依存関係の1つをロードできませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

リダイレクトを含むセクションを再挿入すると、プログラムは正常に実行されます。

要約すると、FSharp.Core 4.0への参照を追加すると、リダイレクトは次のようになります。

<bindingRedirect oldVersion="0.0.0.0-4.4.1.0" newVersion="4.4.0.0" />

これらの変更により、VS 2015でもソリューションは期待どおりに機能します。

17
Bent Tranberg

私は同じ問題を抱えていました、多分これは誰かに役立つでしょう:

私の場合、原因は、FSharp.Coreに推移的な依存関係を持つC#プロジェクトの一部が、NuGetパッケージを使用する代わりに、システムに直接インストールされたランタイムのアセンブリを参照していたことです。つまり参照にはNuGetパッケージフォルダーを指すヒントパスがなかったため、F#SDKからC:\Program Files\FSharp\...からアセンブリを選択していました。この問題を解決するには、参照を削除し、FSharp.Core NuGetパッケージを再インストールしました。

したがって、この:

<Reference Include="FSharp.Core, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

になる:

<Reference Include="FSharp.Core, Version=4.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\..\..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll</HintPath>
  <Private>True</Private>
</Reference>
2
Efrain