Вот почему задавался этот вопрос: www.devplusplus.com/Tests/CSharp/Hello_World.
В то время как подобные вопросы были заданы раньше, в многочисленных ответах онлайн есть несколько проблем:
- Это должно быть сделано ".Net 4.0", а не устаревший.
- Сборка находится в памяти и будет только в памяти, она не может быть записана в файловую систему.
- Я хотел бы ограничить доступ к файловой системе, сети и т.д.
Что-то вроде этого:
var evidence = new Evidence();
evidence.AddHostEvidence(new Zone(SecurityZone.Internet));
var permissionSet = SecurityManager.GetStandardSandbox(evidence);
Пока я не могу найти способ создания AppDomain и загружать сборку , которая НЕ НА СИСТЕМУ ФАЙЛОВ, а скорее в ОЗУ.
Опять же, причины, по которым другие решения не работали, указаны выше: 1. Многие из них были для pre-4.0 и 2. Многие полагались на метод ".Load", указывающий на файловую систему.
Ответ 2: У меня есть ссылка на сборку, потому что она генерируется классом CSharpCodeProvider
, поэтому, если вы знаете способ превратить это в массив байтов, это будет идеально!
Пример кода для выявления недостатков безопасности
var provider = new CSharpCodeProvider(new Dictionary<String, String>
{ { "CompilerVersion", "v4.0" } });
var compilerparams = new CompilerParameters
{ GenerateExecutable = false, GenerateInMemory = true, };
var compilerResults = provider.CompileAssemblyFromSource(compilerparams,
string_Of_Code_From_A_User);
var instanceOfSomeClass = compilerResults.CompiledAssembly
.CreateInstance(className);
// The 'DoSomething' method can write to the file system and I don't like that!
instanceOfSomeClass.GetType().GetMethod("DoSomething")
.Invoke(instanceOfSomeClass, null);
Итак, почему я не могу сначала сохранить сборку в файл?
По двум причинам:
- Этот код находится на общем веб-сервере с ограниченными правами на файловую систему.
- Этот код может запускаться потенциально тысячи раз, и я не хочу 1000 DLL, даже временно.