2013-01-17 64 views
0

如何在.NET Framework 4.0中的當前AppDomain中運行編譯代碼?下面的代碼在net framework 3.5中工作,但是objCompilerParameters.Evidence在.NET Framework 4.0中已經過時了,那麼如何解決它呢?在.NET Framework 4.0中的AppDomain中運行codeCom代碼

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/zh-cn/library/ee191568%28VS.100%29.aspx#migration)包含用於遷移廢棄API的建議 – ChrisWue

+0

我已閱讀那裏描述的建議。我對使用傳統策略選項不感興趣。我想遷移它,但在你提供的msdn鏈接中不夠清晰。另外,在CompilerParameters類的Evidence屬性中,並未說明如何遷移,即如何將安全權限應用於.NET Framework 4.0中的編譯器。 – user1624552

+0

目標是應用安全策略權限來授予編譯的程序集。我不知道如何翻譯objCompilerParameters.Evidence = AppDomain.CurrentDomain.Evidence;轉換爲有效的(不是過時的)點.NET Framework 4.0。 – user1624552

回答

0

安全策略不再適用於應用程序(請注意,.NET Framework配置工具在Framework 4中不再適用)。在桌面上運行的應用程序以完全信任的方式執行。但是,您可以沙盒應用程序並以部分信任方式運行它們。

您必須完全刪除對CompilerParameters.Evidence的引用。

如果您不希望將所有代碼視爲安全性至關重要,則可以使用SecurityRulesAttributeSecurityTranparentAttribute

閱讀關於Security-Transparency。在框架4中增加了second level

從第二級透明度文章摘自:

如果不指定任何屬性,運行時可將所有代碼 爲安全關鍵,除非是安全關鍵違反了 繼承規則(例如,在覆蓋或實施透明虛擬或界面方法時)。在這些情況下,方法 是安全關鍵的。不指定屬性會導致公共語言 運行時爲您確定透明度規則。

ChrisWue建議的是另一種選擇。沙盒您的應用程序。有關如何在沙箱中執行程序集的快速介紹,請參閱SecurityManager.GetStandardSandbox上的示例。 PS:據我瞭解,他們對CAS進行這些更改的原因是因爲使用正確的話相當複雜。我仍然對RequestMinimumRequestOptionalRequestRefuse安全操作感到困惑。