Skip to content

Commit

Permalink
Fixed crash in cilg.exe when generating dll release versions without …
Browse files Browse the repository at this point in the history
…debug symbols.
  • Loading branch information
faubulous committed Jun 24, 2019
1 parent b523daf commit 503d11a
Show file tree
Hide file tree
Showing 6 changed files with 31 additions and 39 deletions.
4 changes: 2 additions & 2 deletions Trinity.CilGenerator/Extensions/TypeDefinitionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,13 +311,13 @@ public static MethodReference TryGetSetValueMethod(this TypeDefinition type, Ass
public static MethodReference TryGetGetValueMethod(this TypeDefinition type, AssemblyDefinition assembly, params TypeReference[] genericArguments)
{

TypeReference mappingType =ILGenerator.propertyMapping;
TypeReference mappingType =ILGenerator.PropertyMapping;
assembly.MainModule.ImportReference(mappingType);
GenericParameter valueType = mappingType.GenericParameters[0];

if (mappingType == null) return null;

MethodDefinition method = type.TryGetInheritedGenericMethod("GetValue",ILGenerator.propertyMapping);
MethodDefinition method = type.TryGetInheritedGenericMethod("GetValue",ILGenerator.PropertyMapping);

if (method == null) return null;

Expand Down
35 changes: 14 additions & 21 deletions Trinity.CilGenerator/ILGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ public class ILGenerator
/// </summary>
public bool WriteSymbols { get; set; }

public static TypeDefinition PropertyMapping;

#endregion

#region Constructors
Expand All @@ -78,7 +80,6 @@ public ILGenerator(ILogger log, bool writeSymbols = true)
#endregion

#region Methods
public static TypeDefinition propertyMapping;

public bool ProcessFile(string sourceFile, string targetFile = "")
{
Expand All @@ -94,20 +95,20 @@ public bool ProcessFile(string sourceFile, string targetFile = "")

try
{

using (var module = CustomResolver.LoadMainModule(sourceFile))
{

module.ReadSymbols();
FileInfo sourceDll = new FileInfo(sourceFile);
if (WriteSymbols)
{
module.ReadSymbols();
}

Assembly = module.Assembly;

var resolver = module.AssemblyResolver;
var trinityRef = module.AssemblyReferences.Where(x => x.Name == "Semiodesk.Trinity").First();
var trinity = resolver.Resolve(trinityRef);
var g = trinity.MainModule.Types.Where(b => b.FullName == "Semiodesk.Trinity.PropertyMapping`1").First();
propertyMapping = g;

PropertyMapping = trinity.MainModule.Types.Where(b => b.FullName == "Semiodesk.Trinity.PropertyMapping`1").First();

Log.LogMessage("------ Begin Task: ImplementRdfMapping [{0}]", Assembly.Name);

Expand Down Expand Up @@ -163,12 +164,17 @@ public bool ProcessFile(string sourceFile, string targetFile = "")
{
var param = new WriterParameters { WriteSymbols = WriteSymbols };

FileInfo sourceDll = new FileInfo(sourceFile);
FileInfo targetDll = new FileInfo(targetFile);

if (sourceDll.FullName != targetDll.FullName)
{
Assembly.Write(targetDll.FullName, param);
}
else
{
Assembly.Write(param);

}
}

result = true;
Expand All @@ -188,19 +194,6 @@ public bool ProcessFile(string sourceFile, string targetFile = "")
return result;
}

string GetAssemblyDirectoryFromType(Type type)
{
return new FileInfo(System.Reflection.Assembly.GetAssembly(type).Location).DirectoryName;
}

void WriteSymbolsToAssembly(string targetFile, ISymbolReader symbolReader, ISymbolWriterProvider symbolWriter)
{
Assembly.MainModule.ReadSymbols(symbolReader);

// NOTE: "WriteSymbols = true" generates the .pdb symbols required for debugging.
Assembly.Write(targetFile, new WriterParameters { WriteSymbols = true, SymbolWriterProvider = symbolWriter });
}

#endregion
}
}
6 changes: 5 additions & 1 deletion Trinity.CilGenerator/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,15 @@ static int Main(string[] args)
}

ILGenerator generator = new ILGenerator(new ConsoleLogger(), writeSymbols);

if (generator.ProcessFile(input, output))
{
return 0;
}
else
{
return -1;

}
}
}
catch (OptionException e)
Expand Down
15 changes: 5 additions & 10 deletions Trinity.CilGenerator/Resolver/CustomResolver.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@

using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Metadata;
using Mono.Cecil;
using System;
using System.Collections.Generic;
Expand All @@ -10,18 +11,16 @@

namespace Semiodesk.Trinity.CilGenerator.Resolver
{

class CustomResolver : ICSharpCode.Decompiler.Metadata.UniversalAssemblyResolver
class CustomResolver : UniversalAssemblyResolver
{
protected CustomResolver(string mainAssemblyFileName, bool throwOnError, string targetFramework) :base(mainAssemblyFileName, throwOnError, targetFramework, System.Reflection.PortableExecutable.PEStreamOptions.PrefetchEntireImage)
protected CustomResolver(string mainAssemblyFileName, bool throwOnError, string targetFramework) : base(mainAssemblyFileName, throwOnError, targetFramework, System.Reflection.PortableExecutable.PEStreamOptions.PrefetchEntireImage)
{

}

public static ModuleDefinition LoadMainModule(string mainAssemblyFileName)
{
var moduleDefinition = new ICSharpCode.Decompiler.Metadata.PEFile(mainAssemblyFileName, System.Reflection.PortableExecutable.PEStreamOptions.PrefetchEntireImage);
var targetFramework = ICSharpCode.Decompiler.Metadata.DotNetCorePathFinderExtensions.DetectTargetFrameworkId(moduleDefinition.Reader);
var moduleDefinition = new PEFile(mainAssemblyFileName, System.Reflection.PortableExecutable.PEStreamOptions.PrefetchEntireImage);
var targetFramework = DotNetCorePathFinderExtensions.DetectTargetFrameworkId(moduleDefinition.Reader);
var resolver = new CustomResolver(mainAssemblyFileName, true, targetFramework);

var module = ModuleDefinition.ReadModule(mainAssemblyFileName, new ReaderParameters
Expand All @@ -30,11 +29,7 @@ public static ModuleDefinition LoadMainModule(string mainAssemblyFileName)
ReadWrite = true
});


return module;
}



}
}
2 changes: 1 addition & 1 deletion Trinity.CilGenerator/Tasks/GeneratorTaskBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ protected virtual void LoadTrinityTypes()
LoadType("Semiodesk.Trinity.Class", out ClassType);
ClassArrayType= new ArrayType(ClassType);

PropertyMappingType = ILGenerator.propertyMapping;
PropertyMappingType = ILGenerator.PropertyMapping;



Expand Down
8 changes: 4 additions & 4 deletions Trinity.CilGenerator/Tasks/ImplementRdfPropertyTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,13 +112,13 @@ public override bool Execute(object parameter = null)

internal FieldDefinition ImplementMappingField(PropertyDefinition property)
{

// Load the property mapping type.
TypeReference mappingType = MainModule.ImportReference(ILGenerator.propertyMapping);

TypeReference mappingType = MainModule.ImportReference(ILGenerator.PropertyMapping);

if(mappingType == null)
if (mappingType == null)
{
throw new ArgumentException(string.Format("{0}: Failed to import type {1}.", Assembly.FullName, mappingType.FullName));
}

// Add the property type as generic parameter.
GenericInstanceType fieldType = new GenericInstanceType(mappingType);
Expand Down

0 comments on commit 503d11a

Please sign in to comment.