如何调试(步入)BinaryFormatter.Deserialize()?

avs*_*099 6 .net debugging debug-symbols visual-studio

我的应用程序尝试反序列化客户端发送的数据,但失败并出现以下错误:

抛出异常:mscorlib.dll中的"System.Runtime.Serialization.SerializationException"

附加信息:无法获得成员'<.ctor> b__0'.

谷歌搜索没有结果.好吧,我决定进入反序列化逻辑,并试图找出导致这种情况的原因.嗯,有一天过去了,我离我很近了.

我使用Microsoft Reference Source网站上的说明来配置Visual Studio.它下载了一些东西

MicrosoftPublicSymbols\mscorlib.pdb\
   DCF1E4D31F6944AC87E7A634262BEE881\mscorlib.pdb (780kb)
   E47257B512BA49BC9FC367C532FC5F1E2\mscorlib.pdb (953kb)
Run Code Online (Sandbox Code Playgroud)

但是调试器没有介入.

我google了更多,并找到了另一种方法 - 安装dotTrace应用程序并将其用作源服务器.这也无济于事.我仍然看到以下内容:

在此输入图像描述

Symbol Load Information mscorlib.pdb的弹出窗口说

C:\ Users\me\AppData\Local\Temp\SymbolCache\MicrosoftPublicSymbols\mscorlib.pdb\e47257b512ba49bc9fc367c532fc5f1e2\mscorlib.pdb:已加载符号.

我可以介入System.Windows.Forms,System.Linq等 - 所以一般来说,它可以工作 - 它只是这个特定的调用BinaryFormatter.Deserialize()不起作用.可能是什么原因以及如何让它进入?

可能是因为SecuritySafeCritical属性?

[System.Security.SecuritySafeCritical] 
public Object Deserialize(Stream serializationStream)
Run Code Online (Sandbox Code Playgroud)

我正在使用VS 2015 .Net 4.5.2(虽然我试过4.5但结果相同).

Ale*_*vin 8

没有任何细节我可以假设这是您尝试序列化和反序列化的对象版本的兼容性问题.看起来客户端会向您发送一些旧的对象位(在构造函数中没有lambda).并且您的服务器运行较新版本的软件,搜索一些lambda方法.

<.ctor> b__0 - 是.ctor(对象构造函数)中第一个lambda方法的方法名称.

因此,例如,如果您有客户端的机器对象A:

class A {
  public A() {
   int a = 5;
   int b = 7;
   // Plain code, no lambdas
  }
}
Run Code Online (Sandbox Code Playgroud)

然后你在服务器上更新你的类,在构造函数中引入lambda:

class A {
  public A() {
   int a = 5;
   int b = 7;
   Func<int,int> some = x => x * 2 + a; 
  }
}
Run Code Online (Sandbox Code Playgroud)

之后,它们的二进制表示形式不一样,A的服务器版本中有私有隐形方法<.ctor> b__0.

在A1类中为lamda方法生成IL