私は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が、正常に動作しています。