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