PageRenderTime 53ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/src/DotNet/Writer/MDTableWriter.cs

https://bitbucket.org/0xd4d/dnlib
C# | 710 lines | 407 code | 48 blank | 255 comment | 2 complexity | 4144e7e18941a54888bac058114d2dd6 MD5 | raw file
  1. /*
  2. Copyright (C) 2012-2013 de4dot@gmail.com
  3. Permission is hereby granted, free of charge, to any person obtaining
  4. a copy of this software and associated documentation files (the
  5. "Software"), to deal in the Software without restriction, including
  6. without limitation the rights to use, copy, modify, merge, publish,
  7. distribute, sublicense, and/or sell copies of the Software, and to
  8. permit persons to whom the Software is furnished to do so, subject to
  9. the following conditions:
  10. The above copyright notice and this permission notice shall be
  11. included in all copies or substantial portions of the Software.
  12. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  13. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  14. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  15. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  16. CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  17. TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  18. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  19. */
  20. using System.IO;
  21. using dnlib.DotNet.MD;
  22. namespace dnlib.DotNet.Writer {
  23. /// <summary>
  24. /// Writes <see cref="MDTable{T}"/>s
  25. /// </summary>
  26. public static class MDTableWriter {
  27. /// <summary>
  28. /// Writes a metadata table
  29. /// </summary>
  30. /// <param name="writer">Writer</param>
  31. /// <param name="table">Table</param>
  32. public static void Write(this BinaryWriter writer, IMDTable table) {
  33. switch (table.Table) {
  34. case Table.Module: writer.Write((MDTable<RawModuleRow>)table); break;
  35. case Table.TypeRef: writer.Write((MDTable<RawTypeRefRow>)table); break;
  36. case Table.TypeDef: writer.Write((MDTable<RawTypeDefRow>)table); break;
  37. case Table.FieldPtr: writer.Write((MDTable<RawFieldPtrRow>)table); break;
  38. case Table.Field: writer.Write((MDTable<RawFieldRow>)table); break;
  39. case Table.MethodPtr: writer.Write((MDTable<RawMethodPtrRow>)table); break;
  40. case Table.Method: writer.Write((MDTable<RawMethodRow>)table); break;
  41. case Table.ParamPtr: writer.Write((MDTable<RawParamPtrRow>)table); break;
  42. case Table.Param: writer.Write((MDTable<RawParamRow>)table); break;
  43. case Table.InterfaceImpl: writer.Write((MDTable<RawInterfaceImplRow>)table); break;
  44. case Table.MemberRef: writer.Write((MDTable<RawMemberRefRow>)table); break;
  45. case Table.Constant: writer.Write((MDTable<RawConstantRow>)table); break;
  46. case Table.CustomAttribute: writer.Write((MDTable<RawCustomAttributeRow>)table); break;
  47. case Table.FieldMarshal: writer.Write((MDTable<RawFieldMarshalRow>)table); break;
  48. case Table.DeclSecurity: writer.Write((MDTable<RawDeclSecurityRow>)table); break;
  49. case Table.ClassLayout: writer.Write((MDTable<RawClassLayoutRow>)table); break;
  50. case Table.FieldLayout: writer.Write((MDTable<RawFieldLayoutRow>)table); break;
  51. case Table.StandAloneSig: writer.Write((MDTable<RawStandAloneSigRow>)table); break;
  52. case Table.EventMap: writer.Write((MDTable<RawEventMapRow>)table); break;
  53. case Table.EventPtr: writer.Write((MDTable<RawEventPtrRow>)table); break;
  54. case Table.Event: writer.Write((MDTable<RawEventRow>)table); break;
  55. case Table.PropertyMap: writer.Write((MDTable<RawPropertyMapRow>)table); break;
  56. case Table.PropertyPtr: writer.Write((MDTable<RawPropertyPtrRow>)table); break;
  57. case Table.Property: writer.Write((MDTable<RawPropertyRow>)table); break;
  58. case Table.MethodSemantics: writer.Write((MDTable<RawMethodSemanticsRow>)table); break;
  59. case Table.MethodImpl: writer.Write((MDTable<RawMethodImplRow>)table); break;
  60. case Table.ModuleRef: writer.Write((MDTable<RawModuleRefRow>)table); break;
  61. case Table.TypeSpec: writer.Write((MDTable<RawTypeSpecRow>)table); break;
  62. case Table.ImplMap: writer.Write((MDTable<RawImplMapRow>)table); break;
  63. case Table.FieldRVA: writer.Write((MDTable<RawFieldRVARow>)table); break;
  64. case Table.ENCLog: writer.Write((MDTable<RawENCLogRow>)table); break;
  65. case Table.ENCMap: writer.Write((MDTable<RawENCMapRow>)table); break;
  66. case Table.Assembly: writer.Write((MDTable<RawAssemblyRow>)table); break;
  67. case Table.AssemblyProcessor: writer.Write((MDTable<RawAssemblyProcessorRow>)table); break;
  68. case Table.AssemblyOS: writer.Write((MDTable<RawAssemblyOSRow>)table); break;
  69. case Table.AssemblyRef: writer.Write((MDTable<RawAssemblyRefRow>)table); break;
  70. case Table.AssemblyRefProcessor: writer.Write((MDTable<RawAssemblyRefProcessorRow>)table); break;
  71. case Table.AssemblyRefOS: writer.Write((MDTable<RawAssemblyRefOSRow>)table); break;
  72. case Table.File: writer.Write((MDTable<RawFileRow>)table); break;
  73. case Table.ExportedType: writer.Write((MDTable<RawExportedTypeRow>)table); break;
  74. case Table.ManifestResource:writer.Write((MDTable<RawManifestResourceRow>)table); break;
  75. case Table.NestedClass: writer.Write((MDTable<RawNestedClassRow>)table); break;
  76. case Table.GenericParam: writer.Write((MDTable<RawGenericParamRow>)table); break;
  77. case Table.MethodSpec: writer.Write((MDTable<RawMethodSpecRow>)table); break;
  78. case Table.GenericParamConstraint: writer.Write((MDTable<RawGenericParamConstraintRow>)table); break;
  79. default:
  80. var cols = table.TableInfo.Columns;
  81. foreach (var row in table.GetRawRows()) {
  82. foreach (var col in cols)
  83. col.Write(writer, row.Read(col.Index));
  84. }
  85. break;
  86. }
  87. }
  88. /// <summary>
  89. /// Writes a <c>Module</c> table
  90. /// </summary>
  91. /// <param name="writer">Writer</param>
  92. /// <param name="table">Table</param>
  93. public static void Write(this BinaryWriter writer, MDTable<RawModuleRow> table) {
  94. var cols = table.TableInfo.Columns;
  95. foreach (var row in table) {
  96. writer.Write(row.Generation);
  97. cols[1].Write(writer, row.Name);
  98. cols[2].Write(writer, row.Mvid);
  99. cols[3].Write(writer, row.EncId);
  100. cols[4].Write(writer, row.EncBaseId);
  101. }
  102. }
  103. /// <summary>
  104. /// Writes a <c>TypeRef</c> table
  105. /// </summary>
  106. /// <param name="writer">Writer</param>
  107. /// <param name="table">Table</param>
  108. public static void Write(this BinaryWriter writer, MDTable<RawTypeRefRow> table) {
  109. var cols = table.TableInfo.Columns;
  110. foreach (var row in table) {
  111. cols[0].Write(writer, row.ResolutionScope);
  112. cols[1].Write(writer, row.Name);
  113. cols[2].Write(writer, row.Namespace);
  114. }
  115. }
  116. /// <summary>
  117. /// Writes a <c>TypeDef</c> table
  118. /// </summary>
  119. /// <param name="writer">Writer</param>
  120. /// <param name="table">Table</param>
  121. public static void Write(this BinaryWriter writer, MDTable<RawTypeDefRow> table) {
  122. var cols = table.TableInfo.Columns;
  123. foreach (var row in table) {
  124. writer.Write(row.Flags);
  125. cols[1].Write(writer, row.Name);
  126. cols[2].Write(writer, row.Namespace);
  127. cols[3].Write(writer, row.Extends);
  128. cols[4].Write(writer, row.FieldList);
  129. cols[5].Write(writer, row.MethodList);
  130. }
  131. }
  132. /// <summary>
  133. /// Writes a <c>FieldPtr</c> table
  134. /// </summary>
  135. /// <param name="writer">Writer</param>
  136. /// <param name="table">Table</param>
  137. public static void Write(this BinaryWriter writer, MDTable<RawFieldPtrRow> table) {
  138. var cols = table.TableInfo.Columns;
  139. foreach (var row in table)
  140. cols[0].Write(writer, row.Field);
  141. }
  142. /// <summary>
  143. /// Writes a <c>Field</c> table
  144. /// </summary>
  145. /// <param name="writer">Writer</param>
  146. /// <param name="table">Table</param>
  147. public static void Write(this BinaryWriter writer, MDTable<RawFieldRow> table) {
  148. var cols = table.TableInfo.Columns;
  149. foreach (var row in table) {
  150. writer.Write(row.Flags);
  151. cols[1].Write(writer, row.Name);
  152. cols[2].Write(writer, row.Signature);
  153. }
  154. }
  155. /// <summary>
  156. /// Writes a <c>MethodPtr</c> table
  157. /// </summary>
  158. /// <param name="writer">Writer</param>
  159. /// <param name="table">Table</param>
  160. public static void Write(this BinaryWriter writer, MDTable<RawMethodPtrRow> table) {
  161. var cols = table.TableInfo.Columns;
  162. foreach (var row in table)
  163. cols[0].Write(writer, row.Method);
  164. }
  165. /// <summary>
  166. /// Writes a <c>Method</c> table
  167. /// </summary>
  168. /// <param name="writer">Writer</param>
  169. /// <param name="table">Table</param>
  170. public static void Write(this BinaryWriter writer, MDTable<RawMethodRow> table) {
  171. var cols = table.TableInfo.Columns;
  172. foreach (var row in table) {
  173. writer.Write(row.RVA);
  174. writer.Write(row.ImplFlags);
  175. writer.Write(row.Flags);
  176. cols[3].Write(writer, row.Name);
  177. cols[4].Write(writer, row.Signature);
  178. cols[5].Write(writer, row.ParamList);
  179. }
  180. }
  181. /// <summary>
  182. /// Writes a <c>ParamPtr</c> table
  183. /// </summary>
  184. /// <param name="writer">Writer</param>
  185. /// <param name="table">Table</param>
  186. public static void Write(this BinaryWriter writer, MDTable<RawParamPtrRow> table) {
  187. var cols = table.TableInfo.Columns;
  188. foreach (var row in table)
  189. cols[0].Write(writer, row.Param);
  190. }
  191. /// <summary>
  192. /// Writes a <c>Param</c> table
  193. /// </summary>
  194. /// <param name="writer">Writer</param>
  195. /// <param name="table">Table</param>
  196. public static void Write(this BinaryWriter writer, MDTable<RawParamRow> table) {
  197. var cols = table.TableInfo.Columns;
  198. foreach (var row in table) {
  199. writer.Write(row.Flags);
  200. writer.Write(row.Sequence);
  201. cols[2].Write(writer, row.Name);
  202. }
  203. }
  204. /// <summary>
  205. /// Writes a <c>InterfaceImpl</c> table
  206. /// </summary>
  207. /// <param name="writer">Writer</param>
  208. /// <param name="table">Table</param>
  209. public static void Write(this BinaryWriter writer, MDTable<RawInterfaceImplRow> table) {
  210. var cols = table.TableInfo.Columns;
  211. foreach (var row in table) {
  212. cols[0].Write(writer, row.Class);
  213. cols[1].Write(writer, row.Interface);
  214. }
  215. }
  216. /// <summary>
  217. /// Writes a <c>MemberRef</c> table
  218. /// </summary>
  219. /// <param name="writer">Writer</param>
  220. /// <param name="table">Table</param>
  221. public static void Write(this BinaryWriter writer, MDTable<RawMemberRefRow> table) {
  222. var cols = table.TableInfo.Columns;
  223. foreach (var row in table) {
  224. cols[0].Write(writer, row.Class);
  225. cols[1].Write(writer, row.Name);
  226. cols[2].Write(writer, row.Signature);
  227. }
  228. }
  229. /// <summary>
  230. /// Writes a <c>Constant</c> table
  231. /// </summary>
  232. /// <param name="writer">Writer</param>
  233. /// <param name="table">Table</param>
  234. public static void Write(this BinaryWriter writer, MDTable<RawConstantRow> table) {
  235. var cols = table.TableInfo.Columns;
  236. foreach (var row in table) {
  237. writer.Write(row.Type);
  238. writer.Write(row.Padding);
  239. cols[1].Write(writer, row.Parent);
  240. cols[2].Write(writer, row.Value);
  241. }
  242. }
  243. /// <summary>
  244. /// Writes a <c>CustomAttribute</c> table
  245. /// </summary>
  246. /// <param name="writer">Writer</param>
  247. /// <param name="table">Table</param>
  248. public static void Write(this BinaryWriter writer, MDTable<RawCustomAttributeRow> table) {
  249. var cols = table.TableInfo.Columns;
  250. foreach (var row in table) {
  251. cols[0].Write(writer, row.Parent);
  252. cols[1].Write(writer, row.Type);
  253. cols[2].Write(writer, row.Value);
  254. }
  255. }
  256. /// <summary>
  257. /// Writes a <c>FieldMarshal</c> table
  258. /// </summary>
  259. /// <param name="writer">Writer</param>
  260. /// <param name="table">Table</param>
  261. public static void Write(this BinaryWriter writer, MDTable<RawFieldMarshalRow> table) {
  262. var cols = table.TableInfo.Columns;
  263. foreach (var row in table) {
  264. cols[0].Write(writer, row.Parent);
  265. cols[1].Write(writer, row.NativeType);
  266. }
  267. }
  268. /// <summary>
  269. /// Writes a <c>DeclSecurity</c> table
  270. /// </summary>
  271. /// <param name="writer">Writer</param>
  272. /// <param name="table">Table</param>
  273. public static void Write(this BinaryWriter writer, MDTable<RawDeclSecurityRow> table) {
  274. var cols = table.TableInfo.Columns;
  275. foreach (var row in table) {
  276. writer.Write(row.Action);
  277. cols[1].Write(writer, row.Parent);
  278. cols[2].Write(writer, row.PermissionSet);
  279. }
  280. }
  281. /// <summary>
  282. /// Writes a <c>ClassLayout</c> table
  283. /// </summary>
  284. /// <param name="writer">Writer</param>
  285. /// <param name="table">Table</param>
  286. public static void Write(this BinaryWriter writer, MDTable<RawClassLayoutRow> table) {
  287. var cols = table.TableInfo.Columns;
  288. foreach (var row in table) {
  289. writer.Write(row.PackingSize);
  290. writer.Write(row.ClassSize);
  291. cols[2].Write(writer, row.Parent);
  292. }
  293. }
  294. /// <summary>
  295. /// Writes a <c>FieldLayout</c> table
  296. /// </summary>
  297. /// <param name="writer">Writer</param>
  298. /// <param name="table">Table</param>
  299. public static void Write(this BinaryWriter writer, MDTable<RawFieldLayoutRow> table) {
  300. var cols = table.TableInfo.Columns;
  301. foreach (var row in table) {
  302. writer.Write(row.OffSet);
  303. cols[1].Write(writer, row.Field);
  304. }
  305. }
  306. /// <summary>
  307. /// Writes a <c>StandAloneSig</c> table
  308. /// </summary>
  309. /// <param name="writer">Writer</param>
  310. /// <param name="table">Table</param>
  311. public static void Write(this BinaryWriter writer, MDTable<RawStandAloneSigRow> table) {
  312. var cols = table.TableInfo.Columns;
  313. foreach (var row in table)
  314. cols[0].Write(writer, row.Signature);
  315. }
  316. /// <summary>
  317. /// Writes a <c>EventMap</c> table
  318. /// </summary>
  319. /// <param name="writer">Writer</param>
  320. /// <param name="table">Table</param>
  321. public static void Write(this BinaryWriter writer, MDTable<RawEventMapRow> table) {
  322. var cols = table.TableInfo.Columns;
  323. foreach (var row in table) {
  324. cols[0].Write(writer, row.Parent);
  325. cols[1].Write(writer, row.EventList);
  326. }
  327. }
  328. /// <summary>
  329. /// Writes a <c>EventPtr</c> table
  330. /// </summary>
  331. /// <param name="writer">Writer</param>
  332. /// <param name="table">Table</param>
  333. public static void Write(this BinaryWriter writer, MDTable<RawEventPtrRow> table) {
  334. var cols = table.TableInfo.Columns;
  335. foreach (var row in table)
  336. cols[0].Write(writer, row.Event);
  337. }
  338. /// <summary>
  339. /// Writes a <c>Event</c> table
  340. /// </summary>
  341. /// <param name="writer">Writer</param>
  342. /// <param name="table">Table</param>
  343. public static void Write(this BinaryWriter writer, MDTable<RawEventRow> table) {
  344. var cols = table.TableInfo.Columns;
  345. foreach (var row in table) {
  346. writer.Write(row.EventFlags);
  347. cols[1].Write(writer, row.Name);
  348. cols[2].Write(writer, row.EventType);
  349. }
  350. }
  351. /// <summary>
  352. /// Writes a <c>PropertyMap</c> table
  353. /// </summary>
  354. /// <param name="writer">Writer</param>
  355. /// <param name="table">Table</param>
  356. public static void Write(this BinaryWriter writer, MDTable<RawPropertyMapRow> table) {
  357. var cols = table.TableInfo.Columns;
  358. foreach (var row in table) {
  359. cols[0].Write(writer, row.Parent);
  360. cols[1].Write(writer, row.PropertyList);
  361. }
  362. }
  363. /// <summary>
  364. /// Writes a <c>PropertyPtr</c> table
  365. /// </summary>
  366. /// <param name="writer">Writer</param>
  367. /// <param name="table">Table</param>
  368. public static void Write(this BinaryWriter writer, MDTable<RawPropertyPtrRow> table) {
  369. var cols = table.TableInfo.Columns;
  370. foreach (var row in table)
  371. cols[0].Write(writer, row.Property);
  372. }
  373. /// <summary>
  374. /// Writes a <c>Property</c> table
  375. /// </summary>
  376. /// <param name="writer">Writer</param>
  377. /// <param name="table">Table</param>
  378. public static void Write(this BinaryWriter writer, MDTable<RawPropertyRow> table) {
  379. var cols = table.TableInfo.Columns;
  380. foreach (var row in table) {
  381. writer.Write(row.PropFlags);
  382. cols[1].Write(writer, row.Name);
  383. cols[2].Write(writer, row.Type);
  384. }
  385. }
  386. /// <summary>
  387. /// Writes a <c>MethodSemantics</c> table
  388. /// </summary>
  389. /// <param name="writer">Writer</param>
  390. /// <param name="table">Table</param>
  391. public static void Write(this BinaryWriter writer, MDTable<RawMethodSemanticsRow> table) {
  392. var cols = table.TableInfo.Columns;
  393. foreach (var row in table) {
  394. writer.Write(row.Semantic);
  395. cols[1].Write(writer, row.Method);
  396. cols[2].Write(writer, row.Association);
  397. }
  398. }
  399. /// <summary>
  400. /// Writes a <c>MethodImpl</c> table
  401. /// </summary>
  402. /// <param name="writer">Writer</param>
  403. /// <param name="table">Table</param>
  404. public static void Write(this BinaryWriter writer, MDTable<RawMethodImplRow> table) {
  405. var cols = table.TableInfo.Columns;
  406. foreach (var row in table) {
  407. cols[0].Write(writer, row.Class);
  408. cols[1].Write(writer, row.MethodBody);
  409. cols[2].Write(writer, row.MethodDeclaration);
  410. }
  411. }
  412. /// <summary>
  413. /// Writes a <c>ModuleRef</c> table
  414. /// </summary>
  415. /// <param name="writer">Writer</param>
  416. /// <param name="table">Table</param>
  417. public static void Write(this BinaryWriter writer, MDTable<RawModuleRefRow> table) {
  418. var cols = table.TableInfo.Columns;
  419. foreach (var row in table)
  420. cols[0].Write(writer, row.Name);
  421. }
  422. /// <summary>
  423. /// Writes a <c>TypeSpec</c> table
  424. /// </summary>
  425. /// <param name="writer">Writer</param>
  426. /// <param name="table">Table</param>
  427. public static void Write(this BinaryWriter writer, MDTable<RawTypeSpecRow> table) {
  428. var cols = table.TableInfo.Columns;
  429. foreach (var row in table)
  430. cols[0].Write(writer, row.Signature);
  431. }
  432. /// <summary>
  433. /// Writes a <c>ImplMap</c> table
  434. /// </summary>
  435. /// <param name="writer">Writer</param>
  436. /// <param name="table">Table</param>
  437. public static void Write(this BinaryWriter writer, MDTable<RawImplMapRow> table) {
  438. var cols = table.TableInfo.Columns;
  439. foreach (var row in table) {
  440. writer.Write(row.MappingFlags);
  441. cols[1].Write(writer, row.MemberForwarded);
  442. cols[2].Write(writer, row.ImportName);
  443. cols[3].Write(writer, row.ImportScope);
  444. }
  445. }
  446. /// <summary>
  447. /// Writes a <c>FieldRVA</c> table
  448. /// </summary>
  449. /// <param name="writer">Writer</param>
  450. /// <param name="table">Table</param>
  451. public static void Write(this BinaryWriter writer, MDTable<RawFieldRVARow> table) {
  452. var cols = table.TableInfo.Columns;
  453. foreach (var row in table) {
  454. writer.Write(row.RVA);
  455. cols[1].Write(writer, row.Field);
  456. }
  457. }
  458. /// <summary>
  459. /// Writes a <c>ENCLog</c> table
  460. /// </summary>
  461. /// <param name="writer">Writer</param>
  462. /// <param name="table">Table</param>
  463. public static void Write(this BinaryWriter writer, MDTable<RawENCLogRow> table) {
  464. foreach (var row in table) {
  465. writer.Write(row.Token);
  466. writer.Write(row.FuncCode);
  467. }
  468. }
  469. /// <summary>
  470. /// Writes a <c>ENCMap</c> table
  471. /// </summary>
  472. /// <param name="writer">Writer</param>
  473. /// <param name="table">Table</param>
  474. public static void Write(this BinaryWriter writer, MDTable<RawENCMapRow> table) {
  475. foreach (var row in table)
  476. writer.Write(row.Token);
  477. }
  478. /// <summary>
  479. /// Writes a <c>Assembly</c> table
  480. /// </summary>
  481. /// <param name="writer">Writer</param>
  482. /// <param name="table">Table</param>
  483. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyRow> table) {
  484. var cols = table.TableInfo.Columns;
  485. foreach (var row in table) {
  486. writer.Write(row.HashAlgId);
  487. writer.Write(row.MajorVersion);
  488. writer.Write(row.MinorVersion);
  489. writer.Write(row.BuildNumber);
  490. writer.Write(row.RevisionNumber);
  491. writer.Write(row.Flags);
  492. cols[6].Write(writer, row.PublicKey);
  493. cols[7].Write(writer, row.Name);
  494. cols[8].Write(writer, row.Locale);
  495. }
  496. }
  497. /// <summary>
  498. /// Writes a <c>AssemblyProcessor</c> table
  499. /// </summary>
  500. /// <param name="writer">Writer</param>
  501. /// <param name="table">Table</param>
  502. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyProcessorRow> table) {
  503. foreach (var row in table)
  504. writer.Write(row.Processor);
  505. }
  506. /// <summary>
  507. /// Writes a <c>AssemblyOS</c> table
  508. /// </summary>
  509. /// <param name="writer">Writer</param>
  510. /// <param name="table">Table</param>
  511. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyOSRow> table) {
  512. foreach (var row in table) {
  513. writer.Write(row.OSPlatformId);
  514. writer.Write(row.OSMajorVersion);
  515. writer.Write(row.OSMinorVersion);
  516. }
  517. }
  518. /// <summary>
  519. /// Writes a <c>AssemblyRef</c> table
  520. /// </summary>
  521. /// <param name="writer">Writer</param>
  522. /// <param name="table">Table</param>
  523. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyRefRow> table) {
  524. var cols = table.TableInfo.Columns;
  525. foreach (var row in table) {
  526. writer.Write(row.MajorVersion);
  527. writer.Write(row.MinorVersion);
  528. writer.Write(row.BuildNumber);
  529. writer.Write(row.RevisionNumber);
  530. writer.Write(row.Flags);
  531. cols[5].Write(writer, row.PublicKeyOrToken);
  532. cols[6].Write(writer, row.Name);
  533. cols[7].Write(writer, row.Locale);
  534. cols[8].Write(writer, row.HashValue);
  535. }
  536. }
  537. /// <summary>
  538. /// Writes a <c>AssemblyRefProcessor</c> table
  539. /// </summary>
  540. /// <param name="writer">Writer</param>
  541. /// <param name="table">Table</param>
  542. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyRefProcessorRow> table) {
  543. var cols = table.TableInfo.Columns;
  544. foreach (var row in table) {
  545. writer.Write(row.Processor);
  546. cols[1].Write(writer, row.AssemblyRef);
  547. }
  548. }
  549. /// <summary>
  550. /// Writes a <c>AssemblyRefOS</c> table
  551. /// </summary>
  552. /// <param name="writer">Writer</param>
  553. /// <param name="table">Table</param>
  554. public static void Write(this BinaryWriter writer, MDTable<RawAssemblyRefOSRow> table) {
  555. var cols = table.TableInfo.Columns;
  556. foreach (var row in table) {
  557. writer.Write(row.OSPlatformId);
  558. writer.Write(row.OSMajorVersion);
  559. writer.Write(row.OSMinorVersion);
  560. cols[3].Write(writer, row.AssemblyRef);
  561. }
  562. }
  563. /// <summary>
  564. /// Writes a <c>File</c> table
  565. /// </summary>
  566. /// <param name="writer">Writer</param>
  567. /// <param name="table">Table</param>
  568. public static void Write(this BinaryWriter writer, MDTable<RawFileRow> table) {
  569. var cols = table.TableInfo.Columns;
  570. foreach (var row in table) {
  571. writer.Write(row.Flags);
  572. cols[1].Write(writer, row.Name);
  573. cols[2].Write(writer, row.HashValue);
  574. }
  575. }
  576. /// <summary>
  577. /// Writes a <c>ExportedType</c> table
  578. /// </summary>
  579. /// <param name="writer">Writer</param>
  580. /// <param name="table">Table</param>
  581. public static void Write(this BinaryWriter writer, MDTable<RawExportedTypeRow> table) {
  582. var cols = table.TableInfo.Columns;
  583. foreach (var row in table) {
  584. writer.Write(row.Flags);
  585. writer.Write(row.TypeDefId);
  586. cols[2].Write(writer, row.TypeName);
  587. cols[3].Write(writer, row.TypeNamespace);
  588. cols[4].Write(writer, row.Implementation);
  589. }
  590. }
  591. /// <summary>
  592. /// Writes a <c>ManifestResource</c> table
  593. /// </summary>
  594. /// <param name="writer">Writer</param>
  595. /// <param name="table">Table</param>
  596. public static void Write(this BinaryWriter writer, MDTable<RawManifestResourceRow> table) {
  597. var cols = table.TableInfo.Columns;
  598. foreach (var row in table) {
  599. writer.Write(row.Offset);
  600. writer.Write(row.Flags);
  601. cols[2].Write(writer, row.Name);
  602. cols[3].Write(writer, row.Implementation);
  603. }
  604. }
  605. /// <summary>
  606. /// Writes a <c>NestedClass</c> table
  607. /// </summary>
  608. /// <param name="writer">Writer</param>
  609. /// <param name="table">Table</param>
  610. public static void Write(this BinaryWriter writer, MDTable<RawNestedClassRow> table) {
  611. var cols = table.TableInfo.Columns;
  612. foreach (var row in table) {
  613. cols[0].Write(writer, row.NestedClass);
  614. cols[1].Write(writer, row.EnclosingClass);
  615. }
  616. }
  617. /// <summary>
  618. /// Writes a <c>GenericParam</c> table
  619. /// </summary>
  620. /// <param name="writer">Writer</param>
  621. /// <param name="table">Table</param>
  622. public static void Write(this BinaryWriter writer, MDTable<RawGenericParamRow> table) {
  623. var cols = table.TableInfo.Columns;
  624. bool useKindColumn = cols.Count >= 5;
  625. foreach (var row in table) {
  626. writer.Write(row.Number);
  627. writer.Write(row.Flags);
  628. cols[2].Write(writer, row.Owner);
  629. cols[3].Write(writer, row.Name);
  630. if (useKindColumn)
  631. cols[4].Write(writer, row.Kind);
  632. }
  633. }
  634. /// <summary>
  635. /// Writes a <c>MethodSpec</c> table
  636. /// </summary>
  637. /// <param name="writer">Writer</param>
  638. /// <param name="table">Table</param>
  639. public static void Write(this BinaryWriter writer, MDTable<RawMethodSpecRow> table) {
  640. var cols = table.TableInfo.Columns;
  641. foreach (var row in table) {
  642. cols[0].Write(writer, row.Method);
  643. cols[1].Write(writer, row.Instantiation);
  644. }
  645. }
  646. /// <summary>
  647. /// Writes a <c>GenericParamConstraint</c> table
  648. /// </summary>
  649. /// <param name="writer">Writer</param>
  650. /// <param name="table">Table</param>
  651. public static void Write(this BinaryWriter writer, MDTable<RawGenericParamConstraintRow> table) {
  652. var cols = table.TableInfo.Columns;
  653. foreach (var row in table) {
  654. cols[0].Write(writer, row.Owner);
  655. cols[1].Write(writer, row.Constraint);
  656. }
  657. }
  658. }
  659. }