コード例 #1
0
        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 }));
        }