有没有办法动态创建,编译和加载ASPX页面

时间:2012-06-05 09:58:45

标签: c# asp.net webforms .net-assembly codedom

好的,我想知道是否可以动态创建ASPX页面。我的意思是,我在*之前已经完成了,但我事先知道我正在创建哪个程序集,并且我事先在目标项目中引用了这个程序集(所以我只是用新的程序来补充旧程序集)。但是现在,我不得不创建ASPX页面所需的所有文件(aspx,代码隐藏和设计器),并将对此reultant程序集的引用添加到当前正在执行的程序集中,以便我可以从那里导航到此页面。 p>

到目前为止,由于CodeDom,我已经能够编译组件文件背后的代码(设计器似乎很简单),并设法动态加载此程序集。 但我不知道如何通过这个程序集访问这个dinamically创建的页面,我想我也必须创建一个.aspx文件(我想这是不可能将.aspx附加到生成的程序集)

对于我想要达到的目标,这可能是一种错误的方法,所以如果有人能够对此提出一些启示,我会很高兴:)

我添加一些代码,如果这有助于任何人:

CodeDomProvider c = CodeDomProvider.CreateProvider("CSharp");

            Assembly executingAssembly = Assembly.GetExecutingAssembly();

            CompilerParameters cp = new CompilerParameters();
            cp.ReferencedAssemblies.Add("system.dll");
            cp.ReferencedAssemblies.Add("system.web.dll");
            cp.ReferencedAssemblies.Add("system.data.dll");
            cp.ReferencedAssemblies.Add("system.xml.linq.dll");
            cp.ReferencedAssemblies.Add("system.drawing.dll");

            cp.CompilerOptions = "/t:library";

            cp.OutputAssembly = "paginatal.dll";

            cp.GenerateInMemory = false;

            StringBuilder sb = new StringBuilder(""); //Texto del codigo
            sb.Append("using System;\n");
            sb.Append("using System.Collections.Generic;");
            sb.Append("using System.Web;");
            sb.Append("using System.Web.UI;");
            sb.Append("using System.Web.UI.WebControls;");

            sb.Append("namespace NuevaClase{ \n");
            sb.Append("public partial class NuevaClase : System.Web.UI.Page { \n");
            sb.Append("public String Yuhuu(){\n return \"Yuhuuuu\";\n }\n");
            sb.Append("protected void Page_Load(object sender, EventArgs e){\n");
            sb.Append("");
            sb.Append("} \n");
            sb.Append("} \n");
            sb.Append("}\n");

CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());

            if (cr.Errors.Count > 0)
            {
                Console.WriteLine("Error");
            }

            Assembly a = cr.CompiledAssembly;
            Assembly.LoadFrom(a.Location);

*我所做的是创建三个文件:.aspx,aspx.cs和aspx.cs.designer;然后在.csproj文件中手动引用它们,这样我就可以使用msbuild编译程序集并移动它来替换目标项目中的前程序集。这个,不管你信不信,工作得很好,但有人认为这不是正确的方法,现在我正在尝试相反的方式,就像我之前告诉你的那样。

1 个答案:

答案 0 :(得分:1)

It might be a wrong approach to what I'm trying to achieve, 
 so I'll be glad if anyone can shed some light uppon this :)

我认为你错过了目标。

目标是什么:显示信息,即响应的输出。

为此,我们使用asp.net帮助我们以编程方式创建输出。

您尝试做的是:创建一个创建第二页的页面,以生成输出。这是为什么 ?为什么不直接使用asp.net编程来显示你的输出和你的信息,为什么你这样做?您希望更改页面顶部的名称吗?

使你的页面像这样的减号。

  1. 您无法处理的错误
  2. 每次创建新页面时,编译器都可能会重新编译整个站点或站点的一部分。
  3. 很有可能创建使系统崩溃的冲突类。