2014-10-05 30 views
0

我一直只有一年多的编码,所以如果我似乎错过了一些明显的东西,随时解释。ASP.net:我如何运行Reflection.Type,并将结果输出到webform文本框中?

我正在为我的C#类开发一个研究组,并且想要放置一个可以在本地使用VS和浏览器运行的ASP.net页面,并且用户可以在名称空间中构建类,代码一个webform文本框中的主要方法,并在屏幕右侧看到输出(就像web教程,除了安全性不是问题:我只是将一个项目放在Bitbucket上)。

因此,我正在构建,编译和实例化一个类和Main方法,并想出了如何访问由CompiilerResults创建的DLL文件,但我无法弄清楚如何从后面的代码,或者获得任何输出到一个字符串变量。我会解决一个执行,并在控制台中看到结果;重要的是输入的代码必须运行。这里是我有什么(大部分注释代码是有测试输出):

母版:

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %> 


<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <asp:ContentPlaceHolder id="head" runat="server"> 
    </asp:ContentPlaceHolder> 
    <asp:ContentPlaceHolder ID="stylesheets" runat="server"> 
     <link rel="stylesheet" href="MasterPage.master.css" type="text/css" /> 
    </asp:ContentPlaceHolder> 
</head> 
<body> 
    <div> 
     <asp:ContentPlaceHolder ID="header" runat="server"> 

     </asp:ContentPlaceHolder> 
    </div> 
    <div> 

     <asp:ContentPlaceHolder id="codeColumn" runat="server"> 

     </asp:ContentPlaceHolder> 

     <asp:ContentPlaceHolder ID="outputColumn" runat="server"> 

     </asp:ContentPlaceHolder> 
    </div> 
    <form runat="server"> 
     <asp:Label ID="headerLabel" Font-Size="X-Large" runat="server"></asp:Label> 
     <!-- User enters code here: --> 
     <asp:TextBox ID="codeTextArea" TextMode="MultiLine" Columns ="50" Rows ="30" runat="server"></asp:TextBox> 
     <!-- Results of code, or caught errors, should be output here: --> 
     <asp:TextBox ID="outputTextArea" TextMode="MultiLine" Rows="30" runat="server"></asp:TextBox> 
     <!-- Clicking the submit button should start the code behind to handle errors, and run clean code: --> 
     <asp:Button ID="submitButton" Text="Run!" OnClick="submitButton_Click" runat="server" /> 
    </form> 
    <div> 
     <asp:ContentPlaceHolder ID="footer" runat="server"> 
      <asp:HyperLink NavigateUrl="~/Default.aspx" runat="server">First Tutorial</asp:HyperLink> 
      <asp:HyperLink NavigateUrl="~/Default.aspx" runat="server">Next Tutorial</asp:HyperLink> 
     </asp:ContentPlaceHolder> 
    </div> 
</body> 
</html> 

而后面的代码:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Microsoft.CSharp; 
using System.CodeDom.Compiler; 
using System.Reflection; 

public partial class MasterPage : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void submitButton_Click(object sender, EventArgs e) 
    { 
     if (codeTextArea.Text != null) 
     { 
      // Build a class and assembly: 
      CSharpCodeProvider provider = new CSharpCodeProvider(); 
      CompilerParameters parameters = new CompilerParameters(); 
      string codeString = @"using System;namespace StudyGroup { public class WebProgram { 

      private String _outputString = ""output""; public static void Main() { "; 
      codeString += codeTextArea.Text; 
      codeString += @" } } }"; 
      CompilerResults results = provider.CompileAssemblyFromSource(parameters, codeString); 
      var path = results.PathToAssembly; 

      // Output: 

      string outputString = ""; 

      // Error handling: 

      if (results.Errors.HasErrors) 
      { 
       outputString += "You haz errors:\n"; 
       foreach (CompilerError error in results.Errors) 
       { 
        outputString += error.ErrorText; 
        outputString += "\n"; 
       } 
       //throw new InvalidOperationException(outputString); 
       outputTextArea.Text = outputString; 
      } 
      else 
      { 

       // Instantiate an instance and invoke Main method: 

       var assembly = Assembly.LoadFrom(path); 
       var program = assembly.GetType("StudyGroup.WebProgram"); 
       var instance = Activator.CreateInstance(program); 
       var main = program.GetMethod("Main"); 
       main.Invoke(instance, null); 

       // Add properties and methods of Type to output: 

       outputString += instance.GetType(); 
       var methods = program.GetMethods(); 
       foreach(MethodInfo m in methods) 
       { 
        outputString += m.Name; 
       } 
       var properties = program.GetProperties(); 
       foreach(PropertyInfo p in properties) 
       { 
        outputString += p.Name; 
        outputString += p.GetMethod; 
       } 
       /*foreach (String s in results.Output) 
       { 
        outputString += s; 
        outputString += "\n"; 
       }*/ 
       //outputString += Console.Out; 

       // Output: 

       Console.WriteLine(outputString); 
       Console.ReadLine(); 
       outputTextArea.Text = outputString; 
      } 
     } 
    } 
} 

回答

0

我已经得到了节目在没有Reflection.Type的情况下在控制台中运行,使用System.Diagnostics.Process.Start,将路径发送到由CompilerResults检索的DLL(或EXE)文件。但是,我无法将控制台输出转换为变量。我将Console.Out设置为一个StreamWriter,然后是一个TextWriter,但是在我的代码后面都没有任何效果,并将代码直接放入codeString var,并将控制台输出写入文件,并抛出一个错误(此文件被另一个进程使用)。如果有人感兴趣,我可以发布更新后的代码。

0

而且,我想我已经明白了!

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using Microsoft.CSharp; 
using System.CodeDom.Compiler; 
using System.Reflection; 
using System.IO; 

public partial class MasterPage : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void submitButton_Click(object sender, EventArgs e) 
    { 
     if (codeTextArea.Text != null) 
     { 

      // Build a class and assembly: 
      CSharpCodeProvider provider = new CSharpCodeProvider(); 
      CompilerParameters parameters = new CompilerParameters(); 
      parameters.GenerateExecutable = true; 
      string codeString = @"using System; using System.IO; namespace StudyGroup { public class WebProgram { private String _outputString = ""output""; public static void Main() { "; 
      codeString += codeTextArea.Text; 
      codeString += @" } } }"; 
      CompilerResults results = provider.CompileAssemblyFromSource(parameters, codeString); 
      var path = results.PathToAssembly; 

      // Output: 

      string outputString = ""; 

      // Error handling: 

      if (results.Errors.HasErrors) 
      { 
       outputString += "You haz errors:\n"; 
       foreach (CompilerError error in results.Errors) 
       { 
        outputString += error.ErrorText; 
        outputString += "\n"; 
       } 
       //throw new InvalidOperationException(outputString); 
       outputTextArea.Text = outputString; 
      } 
      else 
      { 

       // Instantiate an instance and invoke Main method: 

       //var assembly = Assembly.LoadFrom(path); 
       var process = new System.Diagnostics.Process(); 
       process.StartInfo.UseShellExecute = false; 
       process.StartInfo.RedirectStandardOutput = true; 
       process.StartInfo.FileName = path; 

       process.Start(); 

       var moreOutput = process.StandardOutput.ReadToEnd(); 

       outputString += moreOutput; 

       // Output: 

       Console.WriteLine(outputString); 
       Console.ReadLine(); 
       outputTextArea.Text = outputString; 
      } 
     } 
    } 
} 
相关问题