【问题标题】:XmlSerializer exception: You must add a reference to assembly netstandardXmlSerializer 异常:您必须添加对程序集 netstandard 的引用
【发布时间】:2022-09-29 18:12:28
【问题描述】:

我正在研究一种混合了以下目标框架的解决方案:

  • .Net 框架 4.7.2
  • .Net 6.0
  • .Net 标准 2.0

(注意:我们的项目都没有针对低于 4.7.2 的框架版本)。

我一直在逐步将一些库项目从 4.7.2 升级到 Standard 2.0,以及一些前端项目从 4.7.2 升级到 6.0。在已经升级了几个项目之后,我们的一些单元测试失败了,都是由一行代码引起的:

var serializer = new XmlSerializer(typeof(BusinessClass));

XmlSerializer 类属于 System.Xml.Serialization 命名空间。 BusinessClass 类存在于 .Net Standard 2.0 库项目中。

运行这些测试的项目是一个 .Net Framework 4.7.2 MSTest 项目。

完整的例外是:

System.InvalidOperationException: Unable to generate a temporary class (result=1).
error CS0012: The type \'System.Object\' is defined in an assembly that is not referenced. You must add a reference to assembly \'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51\'.
error CS0012: The type \'System.Enum\' is defined in an assembly that is not referenced. You must add a reference to assembly \'netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51\'.

它会导致多次测试失败,但所有这些都是由对XmlSerializer 的单个引用引起的。

我已采取以下步骤尝试解决问题,但无济于事:

  • 我尝试在测试项目中引用NETStandard.Library nuget 包。

  • netstandard 引用的属性下,我已将Copy Local 设置为True,并确认netstandard.dll 出现在bin 文件夹中。

  • 我已将以下内容添加到测试项目的 csproj 文件中:

    <Reference Include=\"netstandard\">
        <Private>True</Private>
    </Reference>
    
  • 我在app.config 中添加了bindingRedirect,如下所示:

    <dependentAssembly>
      <assemblyIdentity name=\"netstandard\" publicKeyToken=\"cc7b13ffcd2ddd51\" culture=\"neutral\" />
      <bindingRedirect oldVersion=\"0.0.0.0-2.0.0.0\" newVersion=\"2.0.3.0\" />
    </dependentAssembly>
    
  • 我已将bindingRedirect 反转为强制降级为2.0.0.0

  • 我已将 System.Xml.XmlSerializer nuget 包引用到 MSTest 项目。

  • 我已将System.Xml.XmlSerializer nuget 包引用到包含BusinessClass 的库中。

上述步骤均未解决此问题。我开始觉得与netstandard 的关系似乎是症状,而不是原因。

不幸的是,我没有想法。我可以采取哪些其他方法来进一步调试问题?

    标签: .net mstest .net-standard .net-framework-version


    【解决方案1】:

    所以事实证明,如果你在 .Net Standard 或 .Net Core 项目中使用XmlSerializer,你会得到这个异常。但是该消息非常具有误导性,并且该修复与添加对netstandard 的引用完全无关。

    修复实际上非常简单:我添加了对 Microsoft.XmlSerializer.Generator 的 Nuget 引用,它突然起作用了。在运行时需要此包才能在 .Net Standard 或 .Net Core 上下文中使用 XmlSerializer

    微软关于此的文章:https://docs.microsoft.com/en-gb/dotnet/core/additional-tools/xml-serializer-generator

    【讨论】:

      【解决方案2】:

      如果您可以控制 netstandard 项目 - 使其具有多目标以解决问题

      <PropertyGroup>
          <TargetFrameworks>netstandard2.0;net471</TargetFrameworks>
      </PropertyGroup>
      

      接受的解决方案对我没有帮助。我混合了 .Net 4.7.1 和 netstandard 2.0 项目 - 两者的混合类的序列化失败并出现上述错误。 经过长时间的调查和不幸的解决方法,我发现该线程揭示了根本原因。微软将其关闭为“不会修复,使用多目标” https://github.com/dotnet/runtime/issues/21373

      【讨论】:

        猜你喜欢
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        • 2012-03-31
        • 1970-01-01
        • 1970-01-01
        • 2016-09-24
        • 2019-06-28
        相关资源
        最近更新 更多