我有
但是当我看到例如.NET 框架中任何引用类的反编译源,例如
System.Console
或对于 Microsoft.AspNetCore.Builder
(或几乎任何其他类型),我所能看到的每个方法的主体都是 throw null (我在下面显示了摘录)
我已阅读this问题(更新:以及该问题的answer是重复的),但只有一个类存在此问题(因为它是在增量更新中添加的)。对我来说,这个问题适用于 .NET 框架中的每个类。我究竟做错了什么?这是预期的行为吗?我应该使用像 dotPeek 这样的东西吗? 我可以使用符号服务器代替反编译源吗? (请原谅我的无知,我对 C#...和 .NET 世界真的很陌生)
region Assembly System.Console, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\3.0.0\ref\netcoreapp3.0\System.Console.dll
// Decompiled with ICSharpCode.Decompiler 4.0.0.4521
#endregion
using System.IO;
using System.Text;
namespace System
{
// Summary:
// ....
public static ConsoleColor BackgroundColor
{
get
{
throw null;
}
set
{
}
}
//
// Summary:
//...
public static int BufferHeight
{
get
{
throw null;
}
set
{
}
}
...
你用ILSpy尝试过吗?
您可以独立使用它(这里免费版本:https://github.com/icsharpcode/ILSpy),但是如果您有 LinqPad,则包含 ILSpy(我认为在付费版本中)。
尝试以下方法:
创建一个示例程序,其中包含您想要检查的 1 行:
void Main()
{
System.Console.Clear();
}
用鼠标指针将光标置于“Clear()”上,然后按 F12。
ILSpy 打开,显示您设置光标的方法:
// System.Console
public static void Clear()
{
ConsolePal.Clear();
}
在左侧,您可以进一步深入了解反编译的类,例如
internal static class ConsolePal
{
[Flags]
internal enum ControlKeyState
{
RightAltPressed = 0x1,
LeftAltPressed = 0x2,
RightCtrlPressed = 0x4,
LeftCtrlPressed = 0x8,
ShiftPressed = 0x10,
NumLockOn = 0x20,
ScrollLockOn = 0x40,
CapsLockOn = 0x80,
EnhancedKey = 0x100
}
private sealed class WindowsConsoleStream : ConsoleStream
{
private readonly bool _isPipe;
private IntPtr _handle;
// ...
注意: 作为 LinqPad 的替代方案,Visual Studio 2022 还默认启用对 F12 的反编译支持。
您看到的“抛出 null”行为是由于 .NET Core 框架是使用“ReadyToRun”(R2R)技术构建的,这意味着编译的代码针对性能和大小进行了优化。为了查看框架类的反编译源代码,您需要通过将以下行添加到 .csproj 文件来禁用 ReadyToRun (R2R) 编译:
<PropertyGroup>
<PublishReadyToRun>false</PublishReadyToRun>
</PropertyGroup>
添加此行后,您需要在 Visual Studio 中卸载并重新加载项目才能使更改生效。完成此操作后,当您导航到框架类时,您应该能够看到框架类的反编译源代码。