5

私はWeb User Controlsコードを介して作成しています(C#コードのライトアウトマークアップ、コードビハインド、およびデザイナーファイルをコールバックでディスクに保存します)。コントロールはすべて正常に作成されます。それらを自分のWebプロジェクトに追加して、ページに配置することができます。

それを使用してコントロールをロードしようとすると、次のLoadControl(path)ようになります。

Unable to load type 'MyNameSpace.UseControlClass'

これは、コントロールがまだコンパイルされていないためです。

しかし、私の要件は、ソリューションを再コンパイルせずに動的にコントロールをロードすることです。

コントロールファイルを作成するときにのみユーザーコントロールをコンパイルするにはどうすればよいですか?これが唯一の方法のようです。

編集:-私の推測では、ファイルはまだコンパイルされていないため、実行時にロードすることは許可されていません。コンパイラを使用してコードファイルをコンパイルしようとしましたCodeDom。好き:

var filePath = Server.MapPath(path);
var provider = CSharpCodeProvider.CreateProvider("C#");
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll", 
                              "Telerik.Web.Design.dll", "Telerik.Web.UI.dll", 
                              "Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"});
opts.GenerateExecutable = false;
opts.GenerateInMemory = true;
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" });

しかし、それは不平を言うcannot find metadata file Telerik.Web.Design.dllなどです。ホストされているシステムでは異なる可能性があるため、telerikパスをハードコーディングしたくありません(bin現在のWebアプリのものですが)。またMyCurrentDll.dll、コードファイルのコンパイル元のファイルのdllもあります。どうすればこれを解決できますか?

私の考えは、コードファイルをコンパイルして動的に作成し、それをWebアプリケーションのディレクトリdllにコピーすることです。binそれは私が最初に述べた問題を解決するかもしれません。

編集2:-ヒットして試用した後、コードファイルを動的にコンパイルして生成することができますdll。dllを生成しbinてアプリケーションに配置した後でも、を使用してユーザーコントロールをロードできませんvirtual path。私は次のアプローチを試しました:

var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);

この後、Ctrlキーが読み込まれます。そのプロパティを割り当てIdて、コントロールに追加しますasp.net Panel。しかし、ポストバック後は表示されません:(

ここで、動的にコンパイルされたdllのタイプをランタイム(appdomainなど)で使用できるようにする必要があります。これにより、仮想パスを使用してコントロールをロードすると、正しくロードさHtmlParseExceptionれ、ロードコントロールフォームTypeが表示されない理由がわかりません。上。

PS:-をLabel使用してコントロールをロードしましたTypeが、正常に動作しています。

4

2 に答える 2

2

結局、私は問題を解決することができました。私が採用した戦略は次のとおりです。

  1. CodeBehindの構造とコードを含むテキストファイルを作成MarkupしますDesigner
  2. 作成するフィールドに関する情報をお読みください。
  3. 文字列ビルダーに必要なコントロールのマークアップを配置します。
  4. 他のいくつかの関連情報をより多くの文字列ビルダーに入れます
  5. ファイルを書く

この後、dllusingCodeDomeコンパイラを作成しました。質問の一部で説明されているように、コンパイル中に直面した主な問題は、Edit参照されるアセンブリが見つからないことでした。これは、binディレクトリのパスのパスを次のようなdllファイル名と一緒に配置することで解決されました。

Server.MapPath("~/bin")+"\\Telerik.Web.dll"

で概説されている次の問題EDIT2は少し単純でした。かなりモロニックでした。動的に生成されたユーザーコントロールに組み込まれている別のユーザーコントロールに問題がありました。

この後も、コードをコンパイルしたページにコントロールをロードできませんでした。これは、コントロールを別のページにロードしたときに解決されました。ランタイムは、動的にコンパイルされたから型を解決できましたdll

于 2012-04-20T09:09:50.603 に答える
1

うーん..この目的でApp_Codeフォルダを使用することを検討しましたか?

アプリケーションの一部としてコンパイルする共有クラスおよびビジネスオブジェクト(..cs、.vbファイルなど)のソースコードが含まれています。動的にコンパイルされたWebサイトプロジェクトでは、ASP.NETは、アプリケーションへの最初の要求時にApp_Codeフォルダー内のコードをコンパイルします。このフォルダ内のアイテムは、変更が検出されたときに再コンパイルされます。

于 2012-04-19T13:26:29.697 に答える