Skip to content

Commit 55a1c5e

Browse files
authored
Fix compile to output native methods CRC for core libraries (#24)
1 parent d4da1bd commit 55a1c5e

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

source/MetadataProcessor.Console/Program.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ public void Parse(string fileName)
4848
}
4949
}
5050

51-
public void Compile(string fileName)
51+
public void Compile(
52+
string fileName,
53+
bool isCoreLibrary)
5254
{
5355
try
5456
{
5557
if (Verbose) System.Console.WriteLine("Compiling assembly...");
5658

57-
_assemblyBuilder = new nanoAssemblyBuilder(_assemblyDefinition, _classNamesToExclude, Minimize, Verbose);
59+
_assemblyBuilder = new nanoAssemblyBuilder(_assemblyDefinition, _classNamesToExclude, Minimize, Verbose, isCoreLibrary);
5860

5961
using (var stream = File.Open(fileName, FileMode.Create, FileAccess.ReadWrite))
6062
using (var writer = new BinaryWriter(stream))
@@ -180,7 +182,7 @@ public static void Main(string[] args)
180182
{
181183
System.Console.WriteLine("");
182184
System.Console.WriteLine("-parse <path-to-assembly-file> Analyses .NET assembly.");
183-
System.Console.WriteLine("-compile <path-to-PE-file> Compiles an assembly into nanoCLR format.");
185+
System.Console.WriteLine("-compile <path-to-PE-file> Compiles an assembly into nanoCLR format. Optionally flags if this it's a core library.");
184186
System.Console.WriteLine("-loadHints <assembly-name> <path-to-assembly-file> Loads one (or more) assembly file(s) as a dependency(ies).");
185187
System.Console.WriteLine("-excludeClassByName <class-name> Removes the class from an assembly.");
186188
System.Console.WriteLine("-generateskeleton Generate skeleton files with stubs to add native code for an assembly.");
@@ -193,9 +195,18 @@ public static void Main(string[] args)
193195
{
194196
md.Parse(args[++i]);
195197
}
196-
else if (arg == "-compile" && i + 1 < args.Length)
198+
else if (arg == "-compile" && i + 2 < args.Length)
197199
{
198-
md.Compile(args[++i]);
200+
bool isCoreLibrary = false;
201+
202+
if (!bool.TryParse(args[i + 2], out isCoreLibrary))
203+
{
204+
System.Console.Error.WriteLine("Bad parameter for compile. IsCoreLib options has to be 'true' or 'false'.");
205+
206+
Environment.Exit(1);
207+
}
208+
209+
md.Compile(args[i + 1], isCoreLibrary);
199210
}
200211
else if (arg == "-excludeclassbyname" && i + 1 < args.Length)
201212
{

source/MetadataProcessor.Core/nanoAssemblyBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public sealed class nanoAssemblyBuilder
2121

2222
private readonly bool _minimize;
2323
private readonly bool _verbose;
24+
private readonly bool _isCoreLibrary;
2425

2526
public nanoTablesContext TablesContext => _tablesContext;
2627

@@ -38,6 +39,7 @@ public nanoAssemblyBuilder(
3839
List<string> classNamesToExclude,
3940
bool minimize,
4041
bool verbose,
42+
bool isCoreLibrary = false,
4143
List<string> explicitTypesOrder = null,
4244
ICustomStringSorter stringSorter = null,
4345
bool applyAttributesCompression = false)
@@ -51,6 +53,7 @@ public nanoAssemblyBuilder(
5153

5254
_minimize = minimize;
5355
_verbose = verbose;
56+
_isCoreLibrary = isCoreLibrary;
5457
}
5558

5659
/// <summary>
@@ -60,7 +63,9 @@ public nanoAssemblyBuilder(
6063
public void Write(
6164
nanoBinaryWriter binaryWriter)
6265
{
63-
var header = new nanoAssemblyDefinition(_tablesContext);
66+
var header = new nanoAssemblyDefinition(
67+
_tablesContext,
68+
_isCoreLibrary);
6469
header.Write(binaryWriter, true);
6570

6671
foreach (var table in GetTables(_tablesContext))

source/MetadataProcessor.Core/nanoAssemblyDefinition.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ public sealed class nanoAssemblyDefinition
3333
/// </summary>
3434
private readonly nanoTablesContext _context;
3535

36+
/// <summary>
37+
/// Flag for core libraries.
38+
/// </summary>
39+
private readonly bool _isCoreLibrary = false;
40+
3641
/// <summary>
3742
/// Offset for current table address writing.
3843
/// </summary>
@@ -50,9 +55,11 @@ public sealed class nanoAssemblyDefinition
5055
/// Assembly tables context - contains all tables used for building target assembly.
5156
/// </param>
5257
public nanoAssemblyDefinition(
53-
nanoTablesContext context)
58+
nanoTablesContext context,
59+
bool isCoreLibrary)
5460
{
5561
_context = context;
62+
_isCoreLibrary = isCoreLibrary;
5663
}
5764

5865
/// <summary>
@@ -82,8 +89,8 @@ public void Write(
8289
// keeping this here for now, just for compatibility
8390
writer.WriteUInt32(0);
8491

85-
// native methods CRC32
86-
writer.WriteUInt32(writer.IsBigEndian ? _context.NativeMethodsCrc.Current : 0);
92+
// native methods CRC32, only for core libs
93+
writer.WriteUInt32(_isCoreLibrary ? _context.NativeMethodsCrc.Current : 0);
8794

8895
// Native methods offset
8996
writer.WriteUInt32(0xFFFFFFFF);

0 commit comments

Comments
 (0)