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)); }
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; }
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); }