ファイルまたはアセンブリを読み込めませんでした“ System.Net.Http、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a”


165

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"またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

プロジェクトのパッケージには以下が含まれます:

<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をターゲットにする必要がありますか、それとも正しいアセンブリを参照する別の方法がありますか?


NuGetパッケージからWeb APIを再インストールしようとしましたか?
Mihai Alexandru-Ionut


そのSO質問のすべての提案された回答を試してみました。これまでのところ何も機能しません。また、使用しupdate-package xxx -reinstallているすべてのnugetパッケージを実行しました。それも機能しません。
Ivan-Mark Debono


ただ、これを参照し、後で私に感謝stackoverflow.com/questions/50536842/...
Ragul

回答:


112

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

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

    <PropertyGroup>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
    </PropertyGroup>
  4. プロジェクトをビルドする
  5. ではbinフォルダがあるはず(WebAppName).dll.configのファイル
  6. リダイレクトが含まれているはずです。これらを web.config
  7. 上記の一部を.csprojファイルから削除します

うまくいくはず


1
ファイルまたはアセンブリ 'Newtonsoft.Json、Version = 6.0.0.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040)
EK_AllDay 2018

2
生成されたファイルからバインディングリダイレクト全体をコピーすることを忘れないでください。最初に上記のエラーが発生しますが、上記のようにbinフォルダーに移動して生成された(webappname).dll.configを取得し、リダイレクトのリスト全体をコピーします。あなたのweb.configに、そして再コンパイルしてください。これは本当に役に立ちました。nuget統合ツールを使用して、最初にできるだけ多くの参照をクリーンアップしてください。
Chris Schaller

4
すごい。これは実際に私のために働いた。@EK_AllDay AssemblyRedirectsを元のweb.configにコピーして戻す必要があります。
David De Sloovere

3
⭐☝ここに値する伝説のバッジ!余談ですが、AssemblyRedirectsをweb.configにコピーして戻したところ、System.Net.Httpのバインドがなくなっていることがわかりました。では、VSが独自のバージョンではなく、.Netフレームワークにパッケージ化されたデフォルトのアセンブリを使用していると想定しますか?
EvilDr

1
この答えは、私が数えるのをやめることさえ何度も私を救った。IMHOの回答としてマークする必要があります。
セバスチャンブドカ

258

私の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>

4
私はAzureにデプロイしましたが、問題なく15分後に、OPで示された正確なエラーが発生し、サーバー上のweb.configを微調整してこの正確な答えで問題を解決しました。しかし、なぜそれが初めて機能したのかはわかりません。デプロイメント間の依存関係を変更していません。
bkwdesign 2017

8
よくやった。何が起こったのかがわかります。System.Net.Httpnugetがインストールされていると確信しているベースドメインプロジェクトにパッケージをインストールしました(おそらく、より高い4.1.xバージョンのものです)。どこでも警告。これにより、Webプロジェクトの問題は修正されましたが、上記のすべてのプロジェクトでnugetパッケージを参照するようにアドバイスすることで、すべての警告が削除されました。参照に関しては、新旧の.NETの混在を心配しているのは私だけですか?通常ローカルdllをnugetパッケージ(dll hell)として参照することを恐れます。
Nicholas Petersen

3
これが正しい方法である理由についてのMicrosoftからの回答は次のとおり
ghanashyaml

18
バインディングリダイレクトの削除は完全に機能しました。
sbkrogers

1
はい、system.net.httpとsystem.runtimeの行を削除するだけです。その後、物事は元気になります。
ZZZ

32

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


ソリューションには3つのプロジェクトがあります。それらABと呼びましょうCAスタートアッププロジェクトで、どちらかとは何の関係もありませんBかをCCはのテストプロジェクトですB。テストを実行CできませんでしAた。参照(System.Net.Http)プロジェクトがなかったためです。
RasmusBækgaard19年


12

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


4
これとAutoGenerateBindingRedirectsの使用に関する@sajeetharanからの回答を組み合わせると、古いバージョンのVSまたはnugetパッケージが正しくないバインディングステートメントを残す可能性があります。きれいに掃除することは大きな助けになります。
Chris Schaller

11

上記のbind-redirectは私には機能しなかったので、への参照をコメントアウトしSystem.Net.Httpましたweb.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>

1
これはVisual Studio 2017(15.9.4)で機能し、.NET 4.7.2フレームワークリリースに同梱されているDLLを直接参照する代わりに、System.Net.Http(4.3.4)NuGetパッケージを使用してビルドできます。IDE内で(他の依存関係が導入されていない)付属の参照を使用するには、次のようにします。1)web / app.configバインディングリダイレクトを削除します。2)System.Net.HttpのNuGetパッケージを削除します。3)[新しい参照の追加]を開き、直接リンクします。 .NET 4.7に同梱されている新しい4.2.0.0ビルドに。
EnocNRoll-AnandaGopal Pardue

これはVS2019でアプリを4.6.1から4.7.2に移行するために機能しました
cklimowski

ウェブジョブとして機能していたコンソールアプリプロジェクトがありました。SendGrid APIクライアントを作成するときにその例外をスローしていました。app.configからバインディングリダイレクトを削除した後、すべてが機能し始めました。これを提案してくれてありがとう。
kurdemol94

9

これを修正するには、プロジェクトを.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>

別のオプション(マシン全体)は、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.

上記のリンクの質問に関するこの回答が、関連する回答になりました。stackoverflow.com / a / 52883065/54289 詳細については、回答に関するコメントを参照してください。
EnocNRoll-AnandaGopal Pardue

6

これは、Visual Studio 2017(15.9.4)を搭載した.NET 4.7.2で機能します。

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

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


4

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

しかし、より多くのプロジェクトを使用するソリューションがある場合は、すべてのプロジェクトを手動で更新するのが本当に面倒です(また、場合によっては、いくつかのnugetパッケージを更新した後で、もう一度実行する必要があります)。そして、それが私が単純な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"

おそらくそれは完璧ではなく、誰かがそれを事前構築タスクにリンクした方が良いでしょう。


3

VS2017の4.6.1-2では、VS2017またはMsbuild 15が使用したいバージョンによってSystem.Net.Httpのバージョンが不要に置き換えられる可能性があります。

ここでこのバージョンを削除しました:

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

そしてここ:

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net461 \ lib \ System.Net.Http.dll

次に、NuGetを介して参照したバージョンでプロジェクトがビルドされます。


1

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


0

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


0

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

すべてが機能し、エラーは発生せず、問題なく公開されました。また、System.Net.Httpエラーメッセージに偶然出会ったのは偶然でしたが、小さな、通知は困難ですが、非常に重要なAPIリクエストがWebサイトで表示されました。 m作業中です。

4.6.1にロールバックしましたが、すべて問題ありません。


0

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

(これは奇妙です。なぜなら、正しいSystem.Net.Http.dllがテストプロジェクトのbinディレクトリに存在し、.config assemblyBingingsも問題ないように見えたためです。)


0

nugetを使用して古いWebサイトを更新していました(.Net更新とMVC更新を含む)。

VS2017でSystem.Net.HTTP参照を削除し(バージョン2.0.0.0でした)、参照を再度追加したところ、4.2.0.0が表示されました。

次に、nugetを使用して大量の「パッケージ」を更新し、エラーメッセージが表示された後、参照が2.0.0.0にリセットされたことに気づいたので、削除して再度追加したところ、正常に動作しました...奇妙です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.