Запустите код codeCom в домене приложений в.NET Framework 4.0
Как запустить скомпилированный код в текущем домене приложений в NET Framework 4.0? Ниже приведен код, который работает в net Framework 3.5, но objCompilerParameters.Evidence устарел в NET Framework 4.0, так как его решить?
protected void Button1_Click(object sender, EventArgs e)
{
VBCodeProvider objVBCodeProvider = new VBCodeProvider();
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.Evidence = AppDomain.CurrentDomain.Evidence;
objCompilerParameters.CompilerOptions = string.Empty;
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = false;
objCompilerParameters.IncludeDebugInformation = false;
objCompilerParameters.TreatWarningsAsErrors = false;
objCompilerParameters.WarningLevel = 0;
objCompilerParameters.ReferencedAssemblies.Add(this.GetType().Assembly.Location);
// source contains the code, is of type string
CompilerResults cr = objVBCodeProvider.CompileAssemblyFromSource(objCompilerParameters,source);
if (cr.Errors.HasErrors)
{ Console.WriteLine("Error");
foreach (CompilerError err in cr.Errors)
{ Console.WriteLine(err.ErrorText); } }
else
{
// Some things...
}
}
1 ответ
Политика безопасности больше не применяется к приложениям (обратите внимание, что средство настройки.NET Framework отсутствует в Framework 4). Приложения, которые запускаются на рабочем столе, выполняются с полным доверием. Однако вы можете создавать приложения-песочницы и запускать их с частичным доверием.
Вам придется удалить ссылки на CompilerParameters.Evidence
полностью.
Вы можете использовать SecurityRulesAttribute и SecurityTranparentAttribute, если не хотите, чтобы весь код считался критичным для безопасности.
Читайте о безопасности-прозрачности. В Framework 4 был добавлен второй уровень.
Взято из статьи о прозрачности второго уровня:
Если вы не укажете никаких атрибутов, среда выполнения интерпретирует весь код как критичный для безопасности, кроме случаев, когда критичный для безопасности нарушает правило наследования (например, при переопределении или реализации прозрачного виртуального или интерфейсного метода). В этих случаях методы являются критически безопасными. Указание атрибута не приводит к тому, что общеязыковая среда выполнения определяет для вас правила прозрачности.
То, что предлагает ChrisWue, является еще одной альтернативой. Песочница ваше приложение. Для быстрого ознакомления о том, как выполнить сборку в песочнице, посмотрите пример на SecurityManager.GetStandardSandbox.
PS: Насколько я понимаю, причина, по которой они внесли эти изменения в CAS, заключается в том, что его было довольно сложно использовать правильно. Я все еще путаюсь RequestMinimum
, RequestOptional
а также RequestRefuse
меры безопасности.