Estoy creando Web User Controls
a través de código (mi código C# write-out marcado, código subyacente y archivos de diseñador en el disco en una devolución de llamada). Los controles son creados todo bien. Puedo agregarlos a mi proyecto web y ponerlos en una página.Cargando el control ASCX creado dinámicamente (a través del código)
Cuando intento cargar el control mediante LoadControl(path)
que dice:
Unable to load type 'MyNameSpace.UseControlClass'
que es porque el control aún no se compila.
Pero mi requisito es cargar controles dinámicamente sin volver a compilar la solución.
¿Cómo puedo compilar el control de usuario solo cuando creo los archivos de control? Como esta parece ser la única salida.
EDIT: - Lo que supongo es que como el archivo no está compilado aún no está permitido cargarlo en tiempo de ejecución. Intenté compilar el archivo de código usando el compilador CodeDom
. Al igual que:
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" });
Pero se queja de cannot find metadata file Telerik.Web.Design.dll
etc. Yo no quiero codificar el camino telerik como podría ser diferente en el sistema organizado (aunque es en el bin
de aplicación web actual). También MyCurrentDll.dll
es el dll del archivo desde el que estoy compilando el archivo de código. ¿Cómo puedo resolver esto?
Mi idea es compilar el archivo de código crear un dll
dinámicamente y copiarlo en el directorio bin
de la aplicación web. Podría resolver el problema que originalmente planteé.
EDIT 2: - Después del golpe y la prueba, puedo compilar el archivo de código dinámicamente y generar el dll
. Incluso después de generar dll y colocarlo en bin
de mi aplicación, no puedo cargar el control de usuario usando virtual path
. He intentado el siguiente acercamiento:
var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);
El ctrl se carga después de esto. Asigno su propiedad Id
y la agrego a un control asp.net Panel
. Pero no es visible después de la devolución de datos :(
Ahora tengo que hacer de alguna manera los tipos dll compilados dinámicamente disponibles para el tiempo de ejecución (appdomain, tal vez) para que cuando cargue control usando la ruta virtual esté correctamente cargado y yo no reciben HtmlParseException
o averiguar qué forma de control de carga Type
no aparece
PS: -. he cargado un control Label
usando Type
y que funciona correctamente
Esa es una pregunta muy interesante. No puedo pensar en un caso de uso para esto, pero la forma en que normalmente me acerco a esto es tener otro ensamblado que sepa cómo crear controles y emita el código HTML, etc., en tiempo de ejecución. ¿Quizás un enfoque similar sería posible aquí al incorporar sus nuevos controles en otro ensamblaje que luego puede compilar y cargar? ¡Veré esta pregunta con interés! – dash
@dash el caso de uso es que permitimos usuario agrupar algunos campos (con tipos de entrada predefinidos) y tomar la entrada de usuario final. Quiero crear un control de usuario, incrustando estos campos. – TheVillageIdiot
¿Están sus controles y la página de alojamiento en CodeFile en lugar de CodeBehind? – jbl