Я создаю 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
и т. Д. Я не хочу жестко кодировать путь telerik, поскольку он может отличаться в размещенной системе (хотя он находится в 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
, и он работает правильно.
CodeFile
илиCodeBehind
в файле разметки пользовательского элемента управления? - person TheVillageIdiot   schedule 19.04.2012