예제 #1
0
        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]
                };
            }
        }
예제 #2
0
        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);
                }
        }