You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

.NET Framework 4.7.2网站通过MSBuild无法解析.NET Standard 2.0引用

解决无.csproj的.NET Framework 4.7.2网站引用.NET Standard 2.0类库的MSBuild构建问题

首先明确:.NET Framework 4.7.2是完全支持引用.NET Standard 2.0类库的,Visual Studio里的运行和调试正常不是显示错误,问题出在无csproj的Web Site项目(区别于Web Application项目)在命令行MSBuild/CI环境下的依赖解析逻辑上——这类项目没有csproj文件来管理NuGet依赖,VS会自动补全这些依赖,但命令行MSBuild不会。

下面是具体的解决步骤:

1. 给Web Site项目添加NETStandard.Library的NuGet依赖

因为Web Site没有csproj,我们需要手动创建/修改packages.config文件:

  • 在网站根目录创建packages.config(如果不存在的话),写入以下内容:
    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="NETStandard.Library" version="2.0.3" targetFramework="net472" />
    </packages>
    
  • 这一步是告诉MSBuild,网站需要NETStandard.Library包来解析.NET Standard 2.0的依赖。

2. 修改MSBuild命令,确保先还原依赖再构建

命令行下MSBuild不会自动还原NuGet包,所以要在构建前加上还原步骤:

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" "[Path to Solution]\AT3.sln" /t:Restore;Build /p:TargetFramework=net472
  • /t:Restore;Build:先执行NuGet还原,再执行构建
  • /p:TargetFramework=net472:显式指定目标框架,避免MSBuild混淆

3. 修正Web.config中的程序集绑定重定向

你之前在

里添加assembly的方式不对,应该在<runtime>节点下添加绑定重定向,确保netstandard程序集被正确解析:

<configuration>
  <!-- 其他配置节点 -->
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
    <!-- 其他绑定重定向 -->
  </runtime>
</configuration>

4. 临时替代方案:生成临时csproj用于构建(如果上述方法无效)

如果不想完全把Web Site转为Web Application,可以临时生成csproj用于CI构建:

  • 在Visual Studio中右键网站项目,选择Convert to Web Application Project,生成对应的csproj文件
  • CI环境中用这个csproj来构建网站,本地开发仍可保留原Web Site结构(注意同步修改代码时要兼顾两者)

为什么VS里正常但命令行不行?

Visual Studio针对Web Site项目做了特殊处理,会自动注入.NET Standard相关的依赖和绑定重定向,但命令行MSBuild没有这个逻辑,必须手动配置依赖和重定向才能正确解析netstandard程序集。

内容的提问来源于stack exchange,提问作者Jack

火山引擎 最新活动