【问题标题】:TypeLoadException in .NET Core project during serialization of value type from referenced .NET Framework project来自引用的 .NET Framework 项目的值类型序列化期间 .NET Core 项目中的 TypeLoadException
【发布时间】:2019-07-04 04:11:19
【问题描述】:

我的项目依赖结构如下:

  • _visualizerTests.dotnetcore -- .NET Core 2.2
    • Visualizer.2019 -- .NET Framework 4.7.2

在 .NET Framework 项目中,我定义了以下类型:

[Serializable]
public struct EndNodeData {
    public string Closure { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
}

当我尝试在 .NET Core 项目中序列化这种类型时:

var endnodeData = new EndNodeData {
    Closure = null,
    Name = null,
    Type = "int",
    Value = "5"
};
var stream = File.Create(Path.GetTempFileName());
var formatter = new BinaryFormatter();
formatter.Serialize(stream, endnodeData);

我得到以下异常:

System.TypeLoadException:'无法从程序集'mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089'加载类型'System.Runtime.CompilerServices.IsReadOnlyAttribute'。'

.NET Framework 项目中定义的类类型可以毫无问题地序列化,就像 .NET Core 项目中定义的值类型一样。

我该如何解决这个问题?

(这是我previous question的后续。)

删除binobj 文件夹,并删除解决方案的.vs 文件夹没有帮助。

我已经提交了issue on the .NET Core repo

【问题讨论】:

  • 您的项目属性列为目标的 Net 版本是什么?您安装了哪些版本的 Microsoft.Net.Framework?如果未安装 Net 版本,通常会出现此问题。根据 Net 的版本,您可能需要安装较旧版本的 Net,因为 Microsoft 在新版本中不包含较旧的库。例如,在 Net 3.5 中,您还需要安装 Net 2.0,因为 3.5 没有所有 2.0 库。我怀疑你有 Net 4.7.2 但没有 4.5。 Net 4.5 我相信是 64 位机器的所有旧版本的累积。尝试目标 x86 而不是 64。
  • 查看 bin 文件夹中 .exe 文件的日期时间。确保所有 exe 都有最新的日期。我有时会看到人们只编译调试版本,然后尝试执行旧版本的发布。在重新编译之前使用 clean 以确保重新编译所有对象。
  • @jdweng 目前所有项目都针对 AnyCPU。另外,我删除了 bin/obj 文件夹和 .vs 文件夹;并运行 Clean solution 然后 Rebuild。所有这些并不能真正解释为什么只有值类型会受到影响。
  • 您正在序列化一个 linq 匿名类型。可能你需要这里引用的 NuGet 包:sebnilsson.com/blog/…
  • @jdweng EndNodeData 不是匿名类型,var 的使用并非如此。

标签: c# .net serialization .net-core


【解决方案1】:

这可能已在 .NET Core 3 中得到修复,但在此之前,可以使用以下解决方法:

  • 避免自动实现的属性;改用完整的属性或公共字段。 (为了抑制编译器警告,我为此使用了[SuppressMessage("", "IDE0032", Justification = "https://github.com/dotnet/core/issues/2981")]
  • 在同一个程序集或一些通用程序集中定义一个自定义System.Runtime.CompilerServices.IsReadOnlyAttribute

Feedback on the Roslyn issue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多