Я создаю 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
, и он работает правильно.