0

好的,我想知道是否可以动态创建一个 ASPX 页面。我的意思是,我以前做过*,但我事先知道我正在创建哪个程序集,并且我提前在目标项目中引用了这个程序集(所以我只是用新的替换旧的)。但是现在,我必须创建 ASPX 页面所需的所有文件(aspx、代码隐藏和设计器),并将对这个结果程序集的引用添加到当前正在执行的程序集中,以便我可以从那里导航到这个页面。

到目前为止,多亏了 CodeDom,我已经能够将背后的代码(设计者似乎很容易)编译成一个程序集文件,并设法动态加载这个程序集。但我不知道如何通过这个程序集访问这个动态创建的页面,我想我也必须创建一个 .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 编译程序集并将其移动以替换目标项目中的前一个程序集。信不信由你,这非常有效,但有人认为这不是正确的方法,现在我正在尝试相反的方法,就像我之前告诉你的那样。

4

1 回答 1

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. 很有可能创建使您的系统崩溃的冲突类。
于 2012-06-05T10:19:29.107 回答