CodeDomProvider, in-memory assemblies и permissions
От: kostya82  
Дата: 22.10.07 04:53
Оценка:
Здравствуйте,

Я использую CodeDomProvider для динамического создания assemblies. Я бы хотел ограничить набор прав для этих сборок.
Мне казалось, что наиболее простой способ это добавление соответствующей директивы к исходному коду программы.

Например:
[assembly: FileIOPermission(SecurityAction.RequestRefuse, Unrestricted = true)]

Но как показывает практика это работает только тогда, когда сборка сохраняется на диск, и не работает в случае in-memory assembly.

Ниже небольшой пример иллюстрирующий проблему.

Если compilerParameters.GenerateInMemory = true то программа успешно завершается.
Если compilerParameters.GenerateInMemory = false то генерируется Exception — что верно поскольку сгенерированая assembly не имеет FileIOPermission.

Мне бы хотелось разобраться почему в случае in-memory assembly Exception не генерируется.

Спасибо

using System;
using System.CodeDom.Compiler;
using System.Reflection;

public static class Program
{
    static String programText = @"
                    using System;
                    using System.Security.Permissions;
                    [assembly: FileIOPermission(SecurityAction.RequestRefuse, Unrestricted = true)]

                    class Program
                    {
                        static public void Main(string[] args)
                        {
                           Console.WriteLine(System.IO.Directory.GetFiles(@""c:\temp\"")[0]);
                        }
                    }
";

    static void Main(string[] args)
    {
        CodeDomProvider compiler = new Microsoft.CSharp.CSharpCodeProvider();
        CompilerParameters compilerParameters = new CompilerParameters(new String[]{"System.dll"});

        compilerParameters.GenerateInMemory = true;
        CompilerResults compilerResults =
            compiler.CompileAssemblyFromSource(compilerParameters, programText);

        if (compilerResults.Errors.Count == 0)
        {
            Type applicationClassType = compilerResults.CompiledAssembly.GetType("Program");
            MethodInfo methodInfo = applicationClassType.GetMethod("Main");
            methodInfo.Invoke(null, new Object[] { new String[0] });
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.