私は自分のプロジェクトを、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をターゲットにする必要がありますか、それとも正しいアセンブリを参照する別の方法がありますか?
私の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>
以下の手順に従ってください。
web.config
からすべてのバインディングリダイレクトを削除これを.csproj
ファイルに追加します。
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup>
bin
フォルダーには(WebAppName).dll.config
ファイルがあるはずですweb.config
にコピーしてください。.csproj
ファイルから上記の断片を削除するうまくいくはずです
私のプロジェクトの1つでは、より高いバージョンのSystem.Net.Httpを備えた小さなパッケージがありました。そして私のスタートアッププロジェクトではSystem.Net.Http v 4.0.0への参照があり、私は私のスタートアッププロジェクトに System.Net.Http nuget package をインストールして問題を解決しました
ソリューションに複数のプロジェクトがある場合は、Visual Studioのソリューションアイコンを右クリックして[ソリューションのNuGetパッケージの管理]を選択し、[統合]タブをクリックしてすべてのプロジェクトを同じバージョンのプロジェクトに統合します。 DLLこれにより、統合する参照アセンブリの一覧が表示されます。リストの各項目をクリックしてから、右側に表示されるタブで[インストール]をクリックします。
上記の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>
プロジェクトを.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.
以下を変更してください。
<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内
私は同じ問題を抱えており、私がそれを修正することができる唯一の方法は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"
おそらくそれは完璧ではなく、誰かがそれをビルド前のタスクにリンクさせるのであればさらに良いでしょう。
これはできましたが、バインディングリダイレクトを更新したNuGetパッケージを追加したためです。パッケージを削除したら、リダイレクトはまだ残っていました。それらすべてを削除してから、update-package -reinstallを実行しました。これにより正しいリダイレクトが追加されました。
私のためにこの問題をきれいに解決した唯一の方法(.NET 4.6.1)は、実際にSystem.Net.Httpを使用したプロジェクトのSystem.Net.Http V4.3.4にNuget参照を追加するだけでなく、スタートアッププロジェクト(私の場合はテストプロジェクト)。
(テストプロジェクトのbinディレクトリに正しいSystem.Net.Http.dllが存在し、.config assemblyBingingsもOKだったため、どちらが奇妙なのか。)
.NET Frameworkのバージョンを確認してください。
私のオリジナルの.netフレームワークは古いバージョンです。
.net framework 4.6をインストールした後、この問題は自動的に解決されます。
私にとって、私は自分のプロジェクトを最新バージョンの.Net Framework(.Net Framework 4.6.1から4.7.2への変更)で実行するように設定しました。
すべてがうまくいって、エラーもなく、問題なく公開されていたのですが、System.Net.Httpエラーメッセージに出会ったのは偶然のことでした。 mに取り組んでいます。
私は4.6.1にロールバックし、すべてがまた元気です。