反编译的源仅显示每个 .NET Framework 类的“throw null”

Decompiled Sources only show "throw null" for every .NET Framework class

提问人:z_eb 提问时间:10/10/2019 最后编辑:Mattz_eb 更新时间:10/12/2023 访问量:1567

问:

我有

  • 已安装 Visual Studio Community 2019 版本 16.3.3(包括“ASP.NET 和 Web 开发”和“.NET Core 跨平台开发”)
  • 并选中了“启用导航到反编译源”,
  • 并创建了新的 ASP.NET Core Web 应用程序 (.NET Core 3.0.0)

但是当我随后查看 .NET 框架中任何引用类的反编译源代码时,例如 或者对于(或几乎任何其他类型),我能看到的每个方法的主体都是抛出 null(我在下面展示了一个摘录)System.ConsoleMicrosoft.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
        {
        }
    }
    ...
C# NET Visual-Studio .Net-Core 反编译

评论

2赞 Euphoric 10/10/2019
这个答案可能就是你所看到的。您正在查看的只是一个“引用”程序集,其中包含元数据和类型签名。实际实现在别的地方。
1赞 z_eb 10/10/2019
嗯,我最初也读过这个答案(它与上面问题的答案相关联),但它说是这种情况,因为有问题的类是在增量更新中添加的。对我来说,每节课都是这样的。如果我在错误的位置(引用)中查找,如何使 Visual Studio 查找正确的位置?或者,是否可以使用符号服务器而不是反编译的源,就像我在设置调试断点时所做的那样?
2赞 Wouter 5/3/2020
那么如何找到真正的组装呢?为什么不反编译呢?
0赞 Nick Kovalsky 3/9/2021
实际上,看看 github.com/dotnet/runtime 实现可以在那里找到
0赞 12/6/2021
您需要找到安装运行时的文件夹。例如。生成器的身份验证 DLL 的路径。Services.AddAuthentication 是 /usr/share/dotnet/shared/Microsoft.AspNet.Core.App/6.0.0/Microsoft.AspNetCore.Authentication.dll,然后使用反编译器打开它(例如。ILSpy in vscode) 直接

答:

0赞 Matt 10/4/2023 #1

你试过ILSpy吗?

您可以独立使用它(此处的免费版本:https://github.com/icsharpcode/ILSpy),但是如果您有 LinqPad,则包含 ILSpy(我认为在付费版本中)。

请按以下方式尝试:

  1. 创建一个包含 1 行您要检查的示例程序:

    void Main()
    {
        System.Console.Clear();
    }
    
  2. 使用鼠标指针,将光标设置在“Clear()”上,然后按 F12。

  3. ILSpy 随即打开,显示设置光标的方法:

     // System.Console
     public static void Clear()
     {
        ConsolePal.Clear();
     }
    
  4. 在左侧,您可以进一步深入研究反编译类,例如

     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 的反编译支持。

0赞 gman1441 12/1/2023 #2

你看到的“抛出 null”行为是由于 .NET Core 框架是使用“ReadyToRun”(R2R) 技术生成的,这意味着编译的代码针对性能和大小进行了优化。若要查看框架类的反编译源代码,需要通过将以下行添加到 .csproj 文件来禁用 ReadyToRun (R2R) 编译:

<PropertyGroup>  
  <PublishReadyToRun>false</PublishReadyToRun>  
</PropertyGroup>  

添加此行后,需要在 Visual Studio 中卸载并重新加载项目,以使更改生效。完成此操作后,当您导航到框架类时,您应该能够看到它们已反编译的源代码。