Пример #1
0
        public static string Execute(string code)
        {
            try
            {
                //CSharpRoslynGuard.Validate(code);
                var compilation = CSharpCompilation.Create(
                    "_",
                    new[] { CSharpSyntaxTree.ParseText(code) },
                    MetadataReferences,
                    new CSharpCompilationOptions(outputKind: OutputKind.DynamicallyLinkedLibrary, allowUnsafe: false)
                    );
                using var assemblyStream  = MemoryStreamManager.GetStream();
                using var rewrittenStream = MemoryStreamManager.GetStream();
                var compilationResult = compilation.Emit(assemblyStream);
                if (!compilationResult.Success)
                {
                    return(string.Join("\r\n", compilationResult.Diagnostics));
                }
                assemblyStream.Seek(0, SeekOrigin.Begin);
                var guardToken = Rewrite(assemblyStream, rewrittenStream);
                rewrittenStream.Seek(0, SeekOrigin.Begin);

                var appDomain = AppDomain.CurrentDomain;
                appDomain.PermissionSet.RemovePermission(typeof(FileIOPermission));
                appDomain.PermissionSet.RemovePermission(typeof(SecurityPermission));
                appDomain.PermissionSet.RemovePermission(typeof(ReflectionPermission));
                appDomain.PermissionSet.SetPermission(new FileIOPermission(FileIOPermissionAccess.NoAccess,
                                                                           new string[0]));
                appDomain.PermissionSet.SetPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
                appDomain.PermissionSet.SetPermission(
                    new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));

                using var context = new IsolatedAssemblyLoadContext();
                var assembly = context.LoadFromStream(rewrittenStream);
                var type     = assembly.GetType("Program", true);
                var method   = type.GetMethod("Run",
                                              BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
                if (method == null)
                {
                    throw new NotSupportedException("Static method 'Run' not found on type 'Program'.");
                }
                using (guardToken.Scope())
                {
                    var result = method.Invoke(null, null);
                    if (result?.GetType().Assembly == assembly ||
                        (result is MemberInfo m && m.Module.Assembly == assembly))
                    {
                        throw new Exception("Result returned by Program.Run must not belong to the user assembly.");
                    }
                    return(result?.ToString());
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                return(null);
            }
        }
        public void Constructor_WhenMoreThanOneAssemblyWithTheSameIdentityIsAdded_DoesNotAddDuplicateEntries()
        {
            var assemblies = new List <string>()
            {
                typeof(IsolatedAssemblyLoadContext).Assembly.Location,
                typeof(AssemblyFile).Assembly.Location,
                typeof(DebugInfo).Assembly.Location
            };

            Assert.DoesNotThrow(() => _ = new IsolatedAssemblyLoadContext(assemblies));
        }
Пример #3
0
    static ContainsTypeChecker()
    {
        var loadContext  = new IsolatedAssemblyLoadContext("Fody.ContainsTypeChecker", AssemblyLocation.CurrentDirectory);
        var assemblyFile = Path.Combine(AssemblyLocation.CurrentDirectory, "FodyIsolated.dll");

        if (!File.Exists(assemblyFile))
        {
            throw new Exception("Could not find: " + assemblyFile);
        }
        var instanceAndUnwrap = loadContext.CreateInstanceFromAndUnwrap(assemblyFile, "IsolatedContainsTypeChecker");

        containsTypeChecker = (IContainsTypeChecker)instanceAndUnwrap;
    }
Пример #4
0
        public void LoadFromAssemblyName_ForTheSameAssembly_ReturnsDifferentAssemblyInstance()
        {
            var assembly = typeof(IsolatedAssemblyLoadContext).Assembly;

            var assemblies = new List <string>()
            {
                assembly.Location,
                typeof(AssemblyFile).Assembly.Location
            };

            var assemblyLoadContext = new IsolatedAssemblyLoadContext(assemblies);
            var loadedAssembly      = assemblyLoadContext.LoadFromAssemblyName(assembly.GetName());

            Assert.AreNotEqual(assembly, loadedAssembly);
        }