2013-01-17 4 views
0

Как запустить скомпилированный код в текущем AppDomain в .NET Framework 4.0? Ниже кода, который работает в net framework 3.5, но objCompilerParameters.Evidence устарел в NET Framework 4.0, так как его решить?Запустить код codeCom в AppDomain в .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... 
    } 
} 
+0

MSDN (http://msdn.microsoft.com/en-us/library/ee191568%28VS.100%29.aspx#migration) содержит предложения по переносу устаревших API – ChrisWue

+0

Я прочитал предлагаемые здесь предложения. Я не заинтересован в использовании опции политики устаревшей политики. Я хотел бы перенести его, но в ссылке msdn, которую вы предоставили, недостаточно ясно. Также в свойстве Evidence для класса CompilerParameters не сказано, как переносить, то есть как применять разрешения безопасности для компилятора в NET Framework 4.0. – user1624552

+0

Целью является применение разрешений политики безопасности для предоставления скомпилированной сборки. Я не знаю, как перевести objCompilerParameters.Evidence = AppDomain.CurrentDomain.Evidence; в действительную (не устаревшую) dot NET Framework 4.0. – user1624552

ответ

0

Политика безопасности больше не применяется к приложениям (обратите внимание, что утилита .NET Framework Configuration отсутствует в Framework 4). Приложения, которые запускаются на рабочем столе, выполняются в полном объеме. Однако вы можете использовать приложения для песочницы и запускать их в частичном доверии.

Вам необходимо будет удалить ссылки на CompilerParameters.Evidence полностью.

Вы можете использовать SecurityRulesAttribute и SecurityTranparentAttribute, если вы не хотите, чтобы весь код считался критичным для безопасности.

Подробнее о Security-Transparency. В Framework 4 добавлен second level.

Взятые из прозрачности второго уровня статьи:

Если вы не укажете атрибуты, среда выполнения интерпретирует весь код в безопасности критически важных, за исключением случаев, будучи безопасности критичных нарушает правила наследования (например, при переопределении или реализации прозрачного виртуального или интерфейса метода ). В этих случаях методы являются безопасными. Указание атрибута не вызывает общий язык для определения правил прозрачности для вас.

Что предлагает ChrisWue - это еще одна альтернатива. Песочница вашего приложения. Для быстрого ввода инструкции о том, как выполнить сборку в песочнице, смотрите пример на SecurityManager.GetStandardSandbox.

PS: Насколько я понимаю, они внесли эти изменения в CAS, потому что было довольно сложно правильно использовать. Я все еще запутался в действиях безопасности RequestMinimum, RequestOptional и RequestRefuse.