public static DynamicMethod CopyToDynamicMethod([NotNull] MethodDefinition method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } var typeMapper = new TypeReferenceMapper(); var methodMapper = new MethodReferenceMapper(typeMapper); var dynamicMethod = new DynamicMethod( method.Name, typeMapper.GetRuntimeType(method.ReturnType), method.Parameters.Select(param => typeMapper.GetRuntimeType(param.ParameterType)).ToArray(), true); dynamicMethod.InitLocals = method.Body.InitLocals; var ilGenerator = dynamicMethod.GetILGenerator(); var copier = new ILCopier(ilGenerator, typeMapper, methodMapper); copier.CopyFrom(method); return(dynamicMethod); }
public Delegate Compile([NotNull] Type delegateType) { var syntaxTree = CreateSyntaxTree(); var references = _referenceLocations .Distinct() .Where(File.Exists) .Select(location => MetadataReference.CreateFromFile(location)) .ToList(); var compilation = CSharpCompilation.Create(ExpressionCompilerAssemblyName) .WithReferences(references) .WithOptions(_compilerOptions) .AddSyntaxTrees(syntaxTree); using (var memoryStream = new MemoryStream()) { var emitResult = compilation.Emit(memoryStream); if (!emitResult.Success) { throw new CompilationErrorException(emitResult, syntaxTree); } memoryStream.Position = 0; var module = ModuleDefinition.ReadModule(memoryStream); var method = module.Types .SelectMany(item => item.Methods) .Single(item => string.Equals(item.Name, MethodName, StringComparison.Ordinal)); var dynamicMethod = ILCopier.CopyToDynamicMethod(method); return(dynamicMethod.CreateDelegate(delegateType)); } }