Здравствуйте,
Я использую 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] });
}
}
}