Загрузка элемента управления ASCX, созданного динамически (с помощью кода)

Я создаю Web User Controlsс помощью кода (мой код C #записываю -разметку, код -позади и файлы дизайнера на диск по обратному вызову ). Элементы управления созданы все отлично. Я могу добавить их в свой веб-проект -и разместить на странице.

Когда я пытаюсь загрузить элемент управления с помощью 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и т. д. Я не хочу жестко кодировать путь телерика, поскольку он может отличаться в размещенной системе (, хотя он находится в binтекущего веб-приложения ). Также MyCurrentDll.dll— это dll файла, из которого я компилирую файл кода. Как я могу решить эту проблему?

Моя идея состоит в том, чтобы скомпилировать файл кода, создать динамически 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, и он работает правильно.

5
задан TheVillageIdiot 19 April 2012 в 13:16
поделиться