Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

321
Visualizações
Cómo hacer referencia al ensamblado en mvc en tiempo de ejecución

En mi aplicación Asp.Net MVC, tengo un archivo de vista ( .cshtml ) que hace referencia a una biblioteca externa que se cargará en tiempo de ejecución. Entonces, después de que se inició la aplicación, cargo el ensamblaje mediante Assembly.Load y registro los controladores mediante mi propia ControllerFactory personalizada y todo está bien.

Pero, en algunas vistas que tienen referencias al ensamblaje cargado dinámicamente, arroja el:

Mensaje de error del compilador: CS0234: el tipo o el nombre del espacio de nombres 'MyDynamicNamespace' no existe en el espacio de nombres 'MyApp' (¿falta una referencia de ensamblado?)

excepción que le dice al compilador de razor que no puede resolver el ensamblado relacionado.

Mi pregunta es, ¿hay alguna manera de registrar el ensamblado en tiempo de ejecución, para que el compilador de razor pueda acceder a él y resolverlo?

Tenga en cuenta que no puedo usar el método BuildManager.AddReferencedAssembly porque mi ensamblaje debe cargarse después del inicio de la aplicación y BuildManager no lo admite.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

1) No recomendaría que sus vistas usen directamente referencias externas o referencias externas cargadas dinámicamente. Resuma esto haciendo que su vista interactúe con un controlador. Haga que su controlador alimente un objeto de datos a su vista que su aplicación conozca en el momento de la compilación (en otras palabras, un objeto conocido por su aplicación web en el momento de la compilación). Esto es para aislar completamente el negocio específico del complemento (abstracto) de su vista. Luego haga que su controlador interactúe con el "complemento".

2) No sé cómo funciona su "fábrica personalizada", pero hoy en día ya no construimos ninguna "fábrica personalizada". En su lugar, aprovechamos los contenedores de inyección de dependencia como Microsoft Unity (o Ninject, o Castle Windsor, etc.). Crear "fábricas personalizadas" está muy pasado de moda y básicamente estás reinventando la rueda que se resolvió con la inyección de dependencia.

3) En cuanto a la carga dinámica de ensamblajes externos, no sé si lo hizo bien, pero aquí hay un enlace:

Cargar dinámicamente un tipo desde un ensamblaje externo

4) Por lo general, el diseño de un complemento expone interfaces que su aplicación web principal conoce en el momento de la compilación. Lo que oculta el diseño del complemento es la implementación que puede cambiar de un complemento a otro. Lo importante es que cada complemento implemente las mismas interfaces públicas, las que espera su aplicación web principal. Por lo general, tendrá esas interfaces en un proyecto "Común" separado al que hacen referencia tanto su aplicación web principal como su complemento que implementa esas interfaces. Por lo tanto, desde su aplicación web principal, sabrá cuáles son las interfaces públicas de sus complementos, puede cargar dinámicamente el ensamblaje externo y usar la reflexión de C# para encontrar las clases que implementan esas interfaces y cargarlas en su contenedor de inyección de dependencia. Del mismo modo, cualquier persona que desee desarrollar un complemento para su aplicación web deberá implementar las interfaces que se definen en su proyecto "Común".

Nota: "Común" es solo un nombre aleatorio que le di al proyecto. Puedes nombrarlo "PluginInterface" o lo que quieras.

Después de eso, hacer que su controlador tome lo que necesite del contenedor de inyección de dependencia es trivial.

Nota: las interfaces de su complemento probablemente tendrán entidades de entrada y salida. Estas entidades se comparten entre su aplicación web principal y su complemento. En tal caso, dado que estas entidades son parte de sus interfaces, deben estar en el proyecto "Común". Puede tener la tentación de que su controlador devuelva esas entidades directamente a su vista, pero entonces no tendrá una abstracción perfecta entre su vista y su complemento. No tener abstracciones perfectas es para otra discusión.

¡Espero eso ayude!

over 4 years ago · Santiago Trujillo Relatório

0

Como administrador del sistema, recomendaría un período de mantenimiento, especialmente si el archivo que reemplaza estropea algo más. Incluso si su período de mantenimiento es de solo media hora, es una buena práctica.

En cuanto a la DLL y la recompilación... por lo general, el proceso de trabajo de IIS (el servicio que ejecuta su grupo de aplicaciones) se reciclará a intervalos normales según la configuración de IIS y el uso de la memoria. Cuando esto suceda, la aplicación se volverá a compilar si algo requiere el JIT. También finaliza todas las sesiones de usuario abiertas ya que se detiene físicamente y luego se reinicia. El proceso de trabajo también supervisa el directorio raíz (como mencionaste) en busca de cambios en los archivos. Si se encuentra alguno, se fuerza una recompilación. El hecho de que se cambie una dependencia no fuerza una recompilación. Si compila previamente su DLL, lo único que queda por compilar es cualquier código dentro de su archivo ASPX real y esto usa el JIT que compila cada vez. Por lo que describió, IIS no debería necesitar volver a compilar o reiniciar, parece otro problema en el que IIS se cuelga cuando cambia el archivo. Es posible que deba involucrar a un administrador del sistema para ver los registros de IIS.

¡Buena suerte!

http://msdn.microsoft.com/en-us/library/ms366723.aspx

http://msdn.microsoft.com/en-us/library/bb398860.aspx

over 4 years ago · Santiago Trujillo Relatório

0

Aquí hay una nota que puede ayudar: si no está cargando sus ensamblajes desde el directorio /bin , debe asegurarse de que la ruta a los ensamblajes sea reconocible:

 AppDomain.CurrentDomain.AppendPrivatePath(path_to_your-dyna_assembly);
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda