.net “*.ni.dll.aux”文件的格式是什么?

.net “*.ni.dll.aux”文件的格式是什么?,.net,format,clr,.net-assembly,ngen,.net,Format,Clr,.net Assembly,Ngen,在C:\Windows\assembly\NativeImages\u v4.0.30319\u 64中找到的*.ni.dll.aux文件的格式(数据布局)是什么?我知道这些是由ngen.exe生成的辅助文件。它们包含哪些数据 分析表明它是一种相当简单的格式(正如汉斯·帕桑所指出的)。它有一个类型字,后跟3个级别的长度字:文件级别、记录级别和基准级别(为了清晰起见,我使用了这些任意术语) 这是一个概述: jcomeau@aspire:~/stackoverflow/17681514$ ./job

C:\Windows\assembly\NativeImages\u v4.0.30319\u 64
中找到的
*.ni.dll.aux
文件的格式(数据布局)是什么?我知道这些是由
ngen.exe
生成的辅助文件。它们包含哪些数据

分析表明它是一种相当简单的格式(正如汉斯·帕桑所指出的)。它有一个类型字,后跟3个级别的长度字:文件级别、记录级别和基准级别(为了清晰起见,我使用了这些任意术语)

这是一个概述:

jcomeau@aspire:~/stackoverflow/17681514$ ./job.py System.Net.ni.dll.aux 
00000005 (00000204): 0b000000bc0000000d000000...00000000000000000000cccc
 0000000b (000000bc): 0d0000005000000053797374...00000000000000000000cccc
  0000000d: (00000050) 'System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\x00\xcc\xcc'
  00000007: (00000004) '\t\x11\x00\x00'
  00000002: (00000008) '\x00i,\x03c]\xcd\x01'
  00000008: (00000014) '\xf3\xd8#\x08\xf7\x08\x9a$1\x11\xb8\x18Rv\xf4@\xa1y\xb2.'
  0000000a: (00000024) '\x011.0.23-106002268\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
 00000004 (00000098): 010000004c0000006d73636f...00000000000000000000cccc
  00000001: (0000004c) 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00'
  00000003: (00000010) '\x9d\xa5\xbb3\xcd\x1c4\xb7\x85\x1c\x08\x8f\x0c\xf7I\xcc'
  0000000a: (00000024) '\x011.0.23-106002119\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
 00000004 (00000098): 010000004c00000053797374...00000000000000000000cccc
  00000001: (0000004c) 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\x00\xcc\xcc'
  00000003: (00000010) '\xe30[\xdb\xd0>\xf9\x19\x05\x1a\xa7\xf2x:\xc3*'
  0000000a: (00000024) '\x011.0.23-106003331\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xcc\xcc'
以下是转储上述内容的脚本(增量开发):

jcomeau@aspire:~/stackoverflow/17681514$ cat job.py
#!/usr/bin/python
import sys, os, struct
def dump(infile):
 data = read(infile)
 filelength = len(data)
 filetype, length, data = next(data)
 assert filelength == length + 8
 print '%08x (%08x): %s' % (filetype, length, snippet(data))
 lengthcheck = 8
 while data:
  recordtype, recordlength, data = next(data)
  lengthcheck += 8 + recordlength
  #debug('remaining data: %s' % snippet(data))
  record, data = data[:recordlength], data[recordlength:]
  print ' %08x (%08x): %s' % (recordtype, recordlength, snippet(record))
  recordcheck = 0  # not 8 because record header was already not counted
  while record:
   subrecordtype, subrecordlength, record = next(record)
   recordcheck += 8 + subrecordlength
   datum, record = record[:subrecordlength], record[subrecordlength:]
   print '  %08x: (%08x) %s' % (subrecordtype, subrecordlength, repr(datum))
  assert recordcheck == recordlength
 assert lengthcheck == filelength
def next(data):
 'each chunk is a type word followed by a length word'
 if not data:
  typeword, length = 0, 0
 elif len(data) > 16:
  typeword = struct.unpack('<I', data[:4])[0]
  length = struct.unpack('<I', data[4:8])[0]
 else:
  raise Exception('Invalid data length %d' % len(data))
 return typeword, length, data[8:]
def read(filename):
 input = open(filename, 'rb')
 data = input.read()
 input.close()
 return data
def snippet(data):
 snippet = data[:12].encode('hex')
 if len(data) > 12:
  snippet += '...'
 if len(data) > 24:
  snippet += data[-12:].encode('hex')
 return snippet
def debug(message):
 if __debug__:
  if message:
   print >>sys.stderr, message
  return True
if __name__ == '__main__':
 for infile in sys.argv[1:]:
  dump(infile)
jcomeau@aspire:~/stackoverflow/17681514$cat job.py
#!/usr/bin/python
导入系统、操作系统、结构
def转储(填充):
数据=读取(填充)
filelength=len(数据)
文件类型、长度、数据=下一个(数据)
断言文件长度==长度+8
打印“%08x(%08x):%s%”(文件类型、长度、代码段(数据))
长度检查=8
而数据:
记录类型,记录长度,数据=下一个(数据)
长度检查+=8+记录长度
#调试('剩余数据:%s'%snippet(数据))
记录,数据=数据[:记录长度],数据[记录长度:]
打印“%08x(%08x):%s%”(记录类型、记录长度、代码段(记录))
recordcheck=0#不是8,因为记录头尚未计数
而记录:
子记录类型,子记录长度,记录=下一个(记录)
recordcheck+=8+子记录长度
基准,记录=记录[:子记录长度],记录[子记录长度:]
打印“%08x:(%08x)%s%”(子记录类型、子记录长度、报告(基准))
assert recordcheck==recordlength
断言长度检查==文件长度
def next(数据):
'每个块都是一个类型词,后跟一个长度词'
如果没有数据:
typeword,长度=0,0
elif len(数据)>16:

typeword=struct.unpack('里面没有太多内容,只是一个包含所有依赖程序集的列表,每个程序集都有少量数据。这在任何地方都没有记录,可能与.NET 4.5优化有关,如配置文件引导优化。您想解决什么问题?这不是离题吗?