5

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

+0

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

+0

@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

+0

¿Están sus controles y la página de alojamiento en CodeFile en lugar de CodeBehind? – jbl

Respuesta

2

Al final pude resolver el problema. A continuación se presenta la estrategia que adoptó:

  1. crear archivos de texto que contienen la estructura de CodeBehind, Markup y Designer código
  2. Lea la información en cuanto a qué campos para crear.
  3. marcado puestos a los controles necesarios en los constructores de cuerda.
  4. poner alguna otra información relacionada en más coadyuvantes de la cadena
  5. archivos de escritura

Después de esto creé el dll usando CodeDome compilador. El principal problema se enfrentó durante la compilación, como se describe en Edit parte de la pregunta, no era encontrar ensamblados de referencia, que se resolvió por la senda de la ruta bin del directorio de poner junto con el nombre del archivo DLL como:

Server.MapPath("~/bin")+"\\Telerik.Web.dll" 

etc.

siguiente problema descrito en EDIT2 era poco más simple. Hubo bastante idiota. Hubo algún problema en otro control de usuario integrado en el control de usuario generado dinámicamente.

Incluso después de esto yo no era capaz de cargar el control en la página desde la que he compilado el código. Esto se resolvió cuando cargué el control en otra página. El tiempo de ejecución pudo resolver el tipo de compilado dinámicamente dll.

+0

¿Puede marcar su respuesta como aceptada para que se elimine de la cola sin respuesta? –

1

hmm .. ¿ha considerado el uso. App_Code folder para este propósito?

Contiene el código fuente para clases compartidas y objetos comerciales (para archivos de ejemplo , ..cs y .vb) que desea compilar como parte de su aplicación . En un proyecto de sitio web compilado dinámicamente, ASP.NET compila el código en la carpeta App_Code en la solicitud inicial al su aplicación. Los elementos en esta carpeta se vuelven a compilar cuando se detectan cambios en .

+0

esto no me va a ayudar ya que estoy creando un control de usuario y los archivos también se crean dinámicamente en tiempo de ejecución. el problema era cargar los archivos creados en el dominio de la aplicación para crear el objeto de control. Lo he resuelto y publicaré la respuesta pronto. – TheVillageIdiot

Cuestiones relacionadas