我一直只有一年多的编码,所以如果我似乎错过了一些明显的东西,随时解释。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;
}
}
}
}