如何访问 .Net CLR blob 项

How to access .Net CLR blob items

我正在研究 Roslyn,到目前为止我已经了解到使用 System.Reflection.Metadata 将 C# 字符串文字放置在 CLR #US(用户字符串)堆中,特别是使用 GetOrAddUserString() 方法。然后在运行时通过 ldstr IL 指令访问这些字符串。

我可以看到 System.Reflection.Metadata 还包含一个 GetOrAddConstantBlob() 方法,可以将数据(包括 UTF16 字符串)放在 blob 堆上。这大概是可以使用 dotPeek 看到的#Blob 元数据,如这篇博客文章的屏幕截图所示: https://blog.maartenballiauw.be/post/2016/11/15/exploring-memory-allocation-and-strings.html

我的问题是,如何访问此 blob 数据?是否有一些 IL 指令对应于 ldstr 呢? System.Reflection.Metadata 中的某些方法?有没有关于这个的文件? (我试过谷歌搜索各种关键字,但没有任何运气。)

没有从 #Blob 流访问数据的 IL 指令。相反,blob 由元数据 table 中的字段引用。例如,MemberRef 元数据 table 的 Signature 列是 #Blob 流中成员签名的偏移量。

文件格式(包括#Blob 流、IL 指令和元数据 tables)由 ECMA-335(特别是分区 II 和 III)定义。