反编译源仅对每个 .NET Framework 类显示“抛出 null”

问题描述 投票:0回答:2

我有

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

但是当我看到例如.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
        {
        }
    }
    ...
c# .net visual-studio .net-core decompiling
2个回答
0
投票

你用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
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.