web-dev-qa-db-ja.com

ファイルまたはアセンブリを読み込めませんでした "System.Net.Http、バージョン= 4.0.0.0、カルチャ=ニュートラル、PublicKeyToken = b03f5f7f11d50a3a"

私は自分のプロジェクトを、Visual Studio 2015 CommunityとSQL Server 2016 ExpressのみがインストールされているクリーンなWindows 10マシンにコピーしました。 Windows 10およびVS2015またはSQL Serverと共にインストールされたもの以外にインストールされている他のフレームワークバージョンはありません。

WebApiプロジェクトを開始しようとすると、次のメッセージが表示されます。

ファイルまたはアセンブリ "System.Net.Http、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a"またはその依存関係のいずれかを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

プロジェクトのパッケージは次のとおりです。

<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Tracing" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />

.NET Framework 4.6.1でプロジェクトをビルドした後、System.Net.Httpファイルがbinフォルダーに見つかりません。

ファイルのパスは以下を指します。

C:¥Program Files(x86)¥Reference Assemblies¥Microsoft¥Framework.NETFramework¥v4.6.1¥System.Net.Http.dll

ファイルのSystem.Net.Http.Formattingのパスは、以下を指します。

C:\ Development\MyApp\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll

プロジェクト全体で4.5.1をターゲットにする必要がありますか、それとも正しいアセンブリを参照する別の方法がありますか?

105

私のweb.config(またはapp.config)でバインディング情報を変更する - 私の見解では「ハック」している間、NuGetパッケージの更新があなたのアプリケーションを破壊し、あなたにSystem.Net.Httpを与えた後、あなたはあなたのプロジェクトを進めることができますエラー。

NewVersion = "4.0.0.0"に設定します。

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.0.0.0" />
</dependentAssembly>
190
tripletdad99

以下の手順に従ってください。

  1. ビジュアルスタジオを最新バージョンにアップデートする(重要)
  2. web.configからすべてのバインディングリダイレクトを削除
  3. これを.csprojファイルに追加します。

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
    
  4. プロジェクトを構築する
  5. binフォルダーには(WebAppName).dll.configファイルがあるはずです
  6. リダイレクトがあるはずです。これらをweb.configにコピーしてください。
  7. .csprojファイルから上記の断片を削除する

うまくいくはずです

49
Sajeetharan

私のプロジェクトの1つでは、より高いバージョンのSystem.Net.Httpを備えた小さなパッケージがありました。そして私のスタートアッププロジェクトではSystem.Net.Http v 4.0.0への参照があり、私は私のスタートアッププロジェクトに System.Net.Http nuget package をインストールして問題を解決しました

24
Ram

ソリューションに複数のプロジェクトがある場合は、Visual Studioのソリューションアイコンを右クリックして[ソリューションのNuGetパッケージの管理]を選択し、[統合]タブをクリックしてすべてのプロジェクトを同じバージョンのプロジェクトに統合します。 DLLこれにより、統合する参照アセンブリの一覧が表示されます。リストの各項目をクリックしてから、右側に表示されるタブで[インストール]をクリックします。

8
TruthSeeker

上記のbind-redirectは私にはうまくいきませんでしたので、System.Net.Httpweb.configへの参照をコメントアウトしました。それなしでもすべてうまくいくようです。

  <system.web>
    <compilation debug="true" targetFramework="4.7.2">
      <assemblies>
        <!--<add Assembly="System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />-->
        <add Assembly="System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      </assemblies>
    </compilation>
    <customErrors mode="Off" />
    <httpRuntime targetFramework="4.7.2" />
  </system.web>
6
Mark

プロジェクトを.NET Framework 4.7.2にアップグレードすることでこれを修正できます。これは Alex Ghiondea - MSFT が答えたものです。彼は本当にそれに値するので彼を投票してください!

これは.NET Framework 4.7.1の既知の問題として文書化されています。

回避策として、これらのターゲットをプロジェクトに追加することができます。 SGENに渡された参照のリストからDesignFacadesToFilterを削除します(そしてSGENが完了したらそれらを再び追加します)

<Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <DesignFacadesToFilter Include="System.IO.Compression.ZipFile" />
    <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" 
        Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> 
    <ReferencePath Remove="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." /> </Target>

<Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
  <ItemGroup>
    <ReferencePath Include="@(_FilterOutFromReferencePath)" />
  </ItemGroup>
  <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has ran." />
</Target>

もう1つのオプション(マシン全体)は、sgen.exe.configに次のバインディングリダイレクトを追加することです。

<runtime>
  <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime> This will only work on machines with .NET Framework 4.7.1. installed. Once .NET Framework 4.7.2 is installed on that machine, this workaround should be removed.
5
Boško Bezik

以下を変更してください。

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />

次のように:

<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.0.0.0" />

web.config内

4
Muhammad Waqas

私は同じ問題を抱えており、私がそれを修正することができる唯一の方法はapp.confingにbindingRedirectを追加する方法です@ tripletdad99を書いた。

あなたがより多くのプロジェクトで解決策を持っているなら、手動ですべてのプロジェクトを本当に吸うのを吸ってください(そして時々またいくつかのnugetパッケージを更新した後にあなたはそれをもう一度する必要があります)。そしてそれは私がすべてのapp.configsなら私が簡単なpowershellスクリプトを書いた理由です。

 param(
    [string]$SourceDirectory,
    [string]$Package,
    [string]$OldVersion,
    [string]$NewVersion
)

Write-Host "Start fixing app.config in $sourceDirectory"
Write-Host "$Package set oldVersion to $OldVersion and newVersion $NewVersion"
Write-Host "Search app.config files.."
[array]$files = get-childitem $sourceDirectory -Include app.config App.config -Recurse | select -expand FullName
foreach ($file in $files)
{
    Write-Host $file
    $xml = [xml](Get-Content $file)
    $daNodes = $xml.configuration.runtime.assemblyBinding.dependentAssembly
    foreach($node in $daNodes)
    {
        if($node.assemblyIdentity.name -eq $package)
        {
            $updateNode = $node.bindingRedirect
            $updateNode.oldVersion = $OldVersion
            $updateNode.newVersion =$NewVersion
            Write-Host "Fix"
        }
    }
    $xml.Save($file)
}

Write-Host "Done"

使い方の例:

./scripts/FixAppConfig.ps1 -SourceDirectory "C:\project-folder" -Package "System.Net.Http" -OldVersion "0.0.0.0-4.3.2.0" -NewVersion "4.0.0.0"

おそらくそれは完璧ではなく、誰かがそれをビルド前のタスクにリンクさせるのであればさらに良いでしょう。

4
Jiri Sykora

これは.NET 4.7.2とVisual Studio 2017(15.9.4)で動作します。

  • Web/app.configバインディングリダイレクトを削除する
  • System.Net.HttpのNuGetパッケージを削除する
  • [Add New Reference]を開き、.NET 4.7.2に同梱されている新しい4.2.0.0ビルドに直接リンクします。

![image](https://user-images.githubusercontent.com/38843378/50998531-b5bb3a00-14f5-11e9-92df-6c590c469349.png)

これはできましたが、バインディングリダイレクトを更新したNuGetパッケージを追加したためです。パッケージを削除したら、リダイレクトはまだ残っていました。それらすべてを削除してから、update-package -reinstallを実行しました。これにより正しいリダイレクトが追加されました。

1
SwampyFox

私のためにこの問題をきれいに解決した唯一の方法(.NET 4.6.1)は、実際にSystem.Net.Httpを使用したプロジェクトのSystem.Net.Http V4.3.4にNuget参照を追加するだけでなく、スタートアッププロジェクト(私の場合はテストプロジェクト)。

(テストプロジェクトのbinディレクトリに正しいSystem.Net.Http.dllが存在し、.config assemblyBingingsもOKだったため、どちらが奇妙なのか。)

0
TvdH

.NET Frameworkのバージョンを確認してください。
私のオリジナルの.netフレームワークは古いバージョンです。
.net framework 4.6をインストールした後、この問題は自動的に解決されます。

0
Frank Myat Thu

私にとって、私は自分のプロジェクトを最新バージョンの.Net Framework(.Net Framework 4.6.1から4.7.2への変更)で実行するように設定しました。

すべてがうまくいって、エラーもなく、問題なく公開されていたのですが、System.Net.Httpエラーメッセージに出会ったのは偶然のことでした。 mに取り組んでいます。

私は4.6.1にロールバックし、すべてがまた元気です。

0
Stuart Aitken