为什么AutogenerateBindingRedirects不适用于Visual Studio 2017中的Web.config

时间:2018-02-25 03:45:46

标签: c# asp.net-mvc visual-studio msbuild .net-standard-2.0

我引用了一个需要Microsoft.AspNet.WebApi.Client 5.2.4的.Net Standard 2.0库。这有很多依赖关系,需要重定向才能使用更新的版本。

为了避免打包/依赖性爆炸,我已经更新了csproj文件中的第一个PropertyGroup:

<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>

我期待AutoGenerateBindingRedirects阻止我需要更改Web.config以匹配添加的版本。

为什么我仍然需要将绑定重定向添加到我的Web.config以解决程序集冲突?

3 个答案:

答案 0 :(得分:9)

根据https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection,AutoGenerateBindingRedirects似乎无法用于网络项目。

检查构建的输出显示绑定重定向仅生成在Web.config中。相反,它们位于$(AssemblyName).dll.config中。此文件具有Web.config的原始配置以及绑定重定向。

要将它们放在一起,您可以让MSBuild将生成的配置复制回Web.config。为此,您需要将以下内容添加到csproj:

<Target Name="AfterBuild">
  <Copy SourceFiles="$(TargetDir)\$(AssemblyName).dll.config" DestinationFiles="Web.config" />
</Target>

答案 1 :(得分:3)

对于iis Express:在Web.config中,将sectionassemblyBinding替换为

  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <linkedConfiguration href="file:{AssemblyName}.dll.config"/>
  </assemblyBinding>

对于iis和iis express:

添加到项目Scripts \ CopyRuntimeSection.ps1

param ($from, $to)
$projectPath = Resolve-Path "$($PSScriptRoot)\..\"

$fromFilePath = "$projectPath\$from";
$toFilePath = "$projectPath\$to";

$fromFileXml = [xml](Get-Content -Path $fromFilePath -Raw)
$toFileXml = [xml](Get-Content -Path $toFilePath -Raw)

$toFileXml.configuration.runtime.InnerXml = $fromFileXml.configuration.runtime.InnerXml
$toFileXml.Save($toFilePath)

添加到csproj

  <Target Name="CopyRuntimeSection" AfterTargets="Build">
    <Exec Command="PowerShell -File Scripts\CopyRuntimeSection.ps1 -from $(OutDir)\$(AssemblyName).dll.config -to Web.config" />
  </Target>

答案 2 :(得分:2)

扩展这个问题的另一个答案,这是一个支持增量构建并使用绝对路径以获得更大灵活性的解决方案:

将其添加到您的解决方案中的某处(我将其命名为 UpdateBindingRedirect.ps1):

param ($from, $to)

$fromFileXml = [xml](Get-Content -Path $from -Raw)
$toFileXml = [xml](Get-Content -Path $to -Raw)

if ( $toFileXml.configuration.runtime.InnerXml -Ne $fromFileXml.configuration.runtime.InnerXml ) {
    $toFileXml.configuration.runtime.InnerXml = $fromFileXml.configuration.runtime.InnerXml
    $toFileXml.Save($to)
}

将此添加到您的 csproj

  <Target Name="UpdateBindingRedirects" AfterTargets="Build" Inputs="$(OutDir)$(AssemblyName).dll.config" Outputs="$(ProjectDir)Web.config">
    <Message Text="Update binding redirects from $(ProjectDir)$(OutDir)$(AssemblyName).dll.config" />
    <Exec Command="PowerShell -NoLogo -NoProfile -File ..\UpdateBindingRedirects.ps1 -from $(ProjectDir)$(OutDir)$(AssemblyName).dll.config -to $(ProjectDir)Web.config" />
  </Target>