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 の 3 つのファイルを作成することでした。そして、.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 を使用します。

あなたがやろうとしているのは、出力を作成する2番目のページを作成するページを作成することです。何故ですか ?asp.netプログラミングを直接使用して、出力と情報を表示しないのはなぜですか?なぜそうするのですか? 変更したいページの上部にある名前ですか?.

あなたのページをそのようにするマイナス。

  1. 対処できない可能性のあるバグ
  2. 新しいページを作成するたびに、コンパイラはサイト全体またはサイトの一部を再コンパイルする場合があります。
  3. システムをクラッシュさせる競合クラスを作成する可能性が非常に高くなります。
于 2012-06-05T10:19:29.107 に答える