【问题标题】:Where could I get the information about the in-memory layout info of .NET Object Model?我在哪里可以获得有关 .NET 对象模型的内存布局信息的信息?
【发布时间】:2010-04-14 03:03:12
【问题描述】:

我想知道 .NET 构造的内存表示形式,例如“interface”、“class”、“struct”等等。Stanley 有一本关于 C++ 对象模型的优秀书籍 - Inside the C++ Object Model>。 Lippman,我想要一本类似的 .NET 和 C# 书。

我读过一些关于 .NET 的书籍,但它们大多是关于 .NET 的逻辑用法。他们都没有谈论 physical 内存中的布局信息。我认为至少有必要了解 .NET 的一种实现。

我已阅读有关“Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects”的内容,有人可以提供一些有关更深入的书籍和文章的提示吗?

如果此信息不公开。可以选择共享源,例如 Mono 或共享源 CLI。

非常感谢。

【问题讨论】:

  • 为什么?你想做什么?
  • 我这样做是为了学术目的。

标签: c# .net


【解决方案1】:

如前所述,CLR Via C# 是一个非常好的信息来源。如果您想深入了解细节,可以查看 SSCLI(共享源公共语言基础结构),它是 MS 源代码中初始 .NET Framework 实现的早期分支。当前版本的 SSCLI 涵盖了大量的 framework 2.0 功能集。

http://www.microsoft.com/downloads/details.aspx?FamilyID=8c09fd61-3f26-4555-ae17-3121b4f51d4d

还有一本书涵盖了 SSCLI,但那是针对第 1 版的,但可能仍然有用。

http://www.amazon.com/Shared-Source-Essentials-David-Stutz/dp/059600351X/ref=sr_1_1?ie=UTF8&s=books&qid=1271220840&sr=8-1

【讨论】:

    【解决方案2】:

    此信息不容易获得的原因几乎可以肯定是代表 Microsoft 故意的。

    Microsoft 创建了 .NET Framework 和 CLR,因此您不必(过度)担心对象在内存中的存储位置/方式(实现细节)。这种“无知”实际上是使用 .NET 的最大好处之一;您无需担心手动内存分配、处理器/内存型号等问题。

    这样做的另一个好处是它提高了安全性,即它使编写恶意代码变得更加困难,尽管当然并非不可能。

    Jeff Richter 的CLR Via C# 可能是当前最好的关于“幕后”类型 .NET 信息的书籍。第 4、5、20 和 21 章可能对 .NET 类型的布局最感兴趣,尽管如上所述,您不会发现与 C++ 对象模型相同的详细程度。

    【讨论】:

    • 谢谢阿什。我这样做是出于学术目的,而不是出于发展目的。而SSCLI2.0就像一个没有地图的迷宫。地图是必要的。
    • 如问题中所述,Microsoft 确实发布了此类信息。自动内存管理并不意味着您不能(无论出于何种原因)了解实现细节。最后,通过默默无闻的安全永远行不通。
    • @Matthew,我实际上在哪里说微软不发布此类信息?我在哪里还说有人不应该了解 .NET 实现细节? (我什至推荐 .NET 的终极实现细节书) 我的观点(你完全错过了)是,在 .NET 中根本不需要知道 .NET 类型的内存布局。另外,我根本没有提到“默默无闻的安全”。我说的是您在 .NET 框架中免费获得的明显安全优势,例如边界检查、安全/不安全代码、安全字符串等。
    【解决方案3】:

    还有另一个原因是,大部分 CLI 信息可能难以获得 - 其中大部分可能是实现细节,这可能在(例如)MS .NET、CF、MF、Silverlight、Mono(常规)之间有所不同、Mono (iPhone) 等。当然,从 语言 的角度来看(C# 等),它很好离题了。

    您必须检查 CLI 规范 (ECMA 335)。信息要么在里面(在这种情况下你被排序),要么不在(在这种情况下它是一个实现细节)。

    【讨论】:

      【解决方案4】:

      如果您真的想看到它们,请了解 WinDbg 和 SOS.dll。如果您可以深入到实时调试或转储分析领域,那么您几乎看不到任何东西。

      问候,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2012-06-04
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多