好的,我想知道是否可以动态创建一个 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 编译程序集并将其移动以替换目标项目中的前一个程序集。信不信由你,这非常有效,但有人认为这不是正确的方法,现在我正在尝试相反的方法,就像我之前告诉你的那样。