Вот причина, по которой был задан этот вопрос: 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);
Пока я не могу найти способ создать домен приложения и загрузить сборку ЭТО НЕ В ФАЙЛОВОЙ СИСТЕМЕ, а скорее в ОЗУ.
Опять же, причины, по которым другие решения не работали, указаны выше: 1. Многие из них были для версий до 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, даже временно.
CSharpCodeProvider
в этом другом домене приложения. Решило бы это вашу проблему? (хотя может появиться множество новых) - person Lasse V. Karlsen   schedule 14.05.2011csc.exe
, что означает, что исходный код и двоичный файл попадают на жесткий диск. - person Gabe   schedule 14.05.2011