提问人:z_eb 提问时间:10/10/2019 最后编辑:Mattz_eb 更新时间:10/12/2023 访问量:1567
反编译的源仅显示每个 .NET Framework 类的“throw null”
Decompiled Sources only show "throw null" for every .NET Framework class
问:
我有
- 已安装 Visual Studio Community 2019 版本 16.3.3(包括“ASP.NET 和 Web 开发”和“.NET Core 跨平台开发”)
- 并选中了“启用导航到反编译源”,
- 并创建了新的 ASP.NET Core Web 应用程序 (.NET Core 3.0.0)
但是当我随后查看 .NET 框架中任何引用类的反编译源代码时,例如 或者对于(或几乎任何其他类型),我能看到的每个方法的主体都是抛出 null(我在下面展示了一个摘录)System.Console
Microsoft.AspNetCore.Builder
我已经阅读了这个问题(更新:以及它重复的问题的答案),但只有一个类有这个问题(因为它是在增量更新中添加的)。对我来说,这个问题适用于 .NET Framework 中的每个类。我做错了什么?这是预期的行为,我应该使用类似 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 中卸载并重新加载项目,以使更改生效。完成此操作后,当您导航到框架类时,您应该能够看到它们已反编译的源代码。
评论