MethodJitter(string module, MemberFilter typeFilter, MemberFilter methodFilter, bool runClassConstructors, IEnumerable <string> searchPaths) { this.typeFilter = typeFilter; this.methodFilter = methodFilter; var paths = new List <string>(); var modulePath = Path.GetDirectoryName(Path.GetFullPath(module)); if (modulePath is null) { throw new ArgumentException(nameof(module)); } paths.Add(modulePath); foreach (var path in searchPaths) { if (Directory.Exists(path)) { paths.Add(path); } } this.searchPaths = paths.ToArray(); nameToAssembly = new Dictionary <string, Assembly?>(); #if NETCOREAPP System.Runtime.Loader.AssemblyLoadContext.Default.Resolving += AssemblyLoadContext_Resolving; #elif NETFRAMEWORK AppDomain.CurrentDomain.AssemblyResolve += AppDomain_AssemblyResolve; #else #error Unknown target framework #endif var asm = Assembly.LoadFile(module); var allTypes = GetTypes(asm).ToArray(); if (runClassConstructors) { foreach (var type in allTypes) { if (!(type.TypeInitializer is null)) { try { RuntimeHelpers.RunClassConstructor(type.TypeHandle); } catch (Exception ex) { Console.WriteLine($"Failed to run {type.FullName} cctor: {ex.Message}"); } } } } foreach (var type in allTypes) { if (!typeFilter.IsMatch(MakeClrmdTypeName(type.FullName ?? string.Empty), (uint)type.MetadataToken)) { continue; } bool isDelegate = typeof(Delegate).IsAssignableFrom(type); foreach (var method in GetMethods(type)) { if (method.IsAbstract) { continue; } if (method.IsGenericMethod) { continue; } if (!methodFilter.IsMatch(method.Name, (uint)method.MetadataToken)) { continue; } #if NETCOREAPP // Not supported on .NET Core if (isDelegate && method is MethodInfo m && m.IsVirtual && (m.Name == "BeginInvoke" || m.Name == "EndInvoke")) { continue; } #endif try { RuntimeHelpers.PrepareMethod(method.MethodHandle); } catch (Exception ex) { string methodName; try { methodName = method.ToString() ?? "???"; } catch { methodName = $"{method.Name} ({method.MetadataToken:X8})"; } Console.WriteLine($"{type.FullName}: {methodName}: Failed to jit: {ex.Message}"); } } } }