private async Task <object> MsRun(IAssemblyLoader loader, int i) { var name = "test" + i; var code = "public class test : roslyn_assemblyunload_lib.HostBase { public int Thing() { return (int)(12.0 * new System.Random().NextDouble()); } }"; var metadataReferences = refs.Select(x => MetadataReference.CreateFromFile(x.Location)) .Cast <MetadataReference>() .ToArray(); var libCompilation = CSharpCompilation.Create(name + "Host", new[] { SyntaxFactory.ParseSyntaxTree(code) }, metadataReferences, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var libReference = libCompilation.ToMetadataReference(); var scriptReferences = metadataReferences.Append(libReference).ToList(); var libStream = EmitToStream(libCompilation); var libAssembly = loader.LoadFromStream(libStream); var hostType = libAssembly.GetType("test"); var hostObject = Activator.CreateInstance(hostType); var scriptCompilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); var scriptCode = "Thing();"; var scriptCompilation = CSharpCompilation.CreateScriptCompilation(name + "Script", SyntaxFactory.ParseSyntaxTree(scriptCode, new CSharpParseOptions(kind: SourceCodeKind.Script)), scriptReferences, scriptCompilationOptions, null, null, hostType); var scriptStream = EmitToStream(scriptCompilation); var scriptAssembly = loader.LoadFromStream(scriptStream); var scriptEntryPoint = scriptCompilation.GetEntryPoint(CancellationToken.None); var scriptEntryPointType = scriptAssembly.GetType(scriptEntryPoint.ContainingType.MetadataName); var scriptEntryPointMethod = scriptEntryPointType.GetMethod(scriptEntryPoint.Name); var scriptDelegate = (Func <object[], Task <object> >)scriptEntryPointMethod.CreateDelegate(typeof(Func <object[], Task <object> >)); return(await scriptDelegate(new object[] { hostObject, null })); }