public ILImporter(ILInterpreter interpreter, MethodDesc method, MethodIL methodIL) { _ilBytes = methodIL.GetILBytes(); _method = method; _methodIL = methodIL; _interpreter = interpreter; var ilExceptionRegions = methodIL.GetExceptionRegions(); _exceptionRegions = new ExceptionRegion[methodIL.GetExceptionRegions().Length]; for (int i = 0; i < ilExceptionRegions.Length; i++) { _exceptionRegions[i] = new ExceptionRegion() { ILRegion = ilExceptionRegions[i] }; } }
public void InterpretDll(string path, string[] args) { using (var stream = File.OpenRead(path)) using (var reader = new PEReader(stream)) { var metadataReader = reader.GetMetadataReader(); // https://github.com/dotnet/corefx/blob/cea2a3e00c9a508fbf92bcaf0aeb4df833514057/src/System.Reflection.MetadataLoadContext/src/System/Reflection/TypeLoading/Modules/Ecma/EcmaModule.cs#L50 var entryPointToken = reader.PEHeaders.CorHeader.EntryPointTokenOrRelativeVirtualAddress; var handle = entryPointToken.AsHandle(); if (handle.Kind != HandleKind.MethodDefinition) { ThrowHelper.ThrowInvalidProgramException(); } var entryPoint = metadataReader.GetMethodDefinition((MethodDefinitionHandle)handle); var entryPointBody = reader.GetMethodBody(entryPoint.RelativeVirtualAddress); var arguments = PrepareEntryPointArguments(entryPoint, args); var interpreter = new ILInterpreter(reader, metadataReader, entryPoint, entryPointBody); interpreter.InterpretMethod(ref arguments); } }