Proporcionar un Explícito Nombre de Ensamblado para un Compila Dinámicamente ASP.NET sitio Web de la Carpeta App_Code?

StackOverflow https://stackoverflow.com/questions/9520231

Pregunta

En un compila dinámicamente ASP.NET proyecto de sitio Web, puede la asamblea de la carpeta App_Code ser nombrado explícitamente?

Por ejemplo, en circunstancias normales, cuando ejecuto un ASP.NET sitio web el nombre del ensamblado generado en el Temporary ASP.NET Files\ la carpeta está parcialmente aleatorios como App_Code.neizakfo.dll donde neizakfo es la parte que puede diferir.Puedo proporcionar explícitamente un nombre para la asamblea como App_Code_Web1.dll?

Aclaración

Por los requisitos de negocio, el sitio web no puede ser precompilado/desplegado.Por lo tanto, estoy en busca de una solución en el contexto de la Temporary ASP.NET Files carpeta y dinámica de los ensamblados compilados como se señaló anteriormente.


De fondo:
Me encontré con esta pregunta, mientras busca una manera de llevar a cabo el tipo de dinámica de la creación de instancias de una clase en la carpeta App_Code de un sitio web mediante una asamblea-nombre completo almacenado en la configuración, pero crea una instancia de la página web, por lo tanto el cruce de un límite de ensamblado.Porque la página web y app_code código se compila en dos montajes diferentes de forma predeterminada, el Tipo.GetType(..) método del comportamiento predeterminado de la búsqueda para el nombre de Tipo en la ejecución de la asamblea (la página web) o en mscorlib no es suficiente para la selección de cualquier Tipo de esta asamblea.Ser aleatorios, esta asamblea no se conoce su nombre para que me incluya en la asamblea-cadena calificada.

Puedo poner el Tipo de datos en una biblioteca de clases (debido a que tiene un predefinidos/nombre exacto) para deshacerse de este problema, sin embargo me gustaría saber cómo hacerlo dentro de la propia página web sin necesidad de crear un proyecto de biblioteca de clases para el propósito.

¿Fue útil?

Solución

Usted puede ordenar de hacer esto en un proyecto de sitio Web.

Hay una Artículo de MSDN sobre el uso de la bandera fixednames al compilar el proyecto.

De esta forma, se crea una asamblea para cada página default.aspx.dll.Sin embargo, esto es sólo marginalmente más útil para usted como usted todavía necesita saber el nombre del control o de la página que usted está buscando cuando se está cargando - así que usted tiene que asegurarse de que su tipos y nomenclatura es consistente.Debe, sin embargo, respetar el nombre de las clases en app_code por lo que este puede trabajar para usted.

Otra cosa que puedes hacer es mover todo el código en app_code a cabo en su propia asamblea, y, a continuación, añadir que como un proyecto de referencia.Que también simplificar este problema.

Por último, usted podría enumerar todos los dll en el directorio bin, y de la búsqueda de cada uno de ellos por el tipo que usted está buscando.Como este es bastante caro, hazlo de una vez, y almacenar en caché el resultado en algún lugar para no seguir haciéndolo cada vez que mirar que tipo de seguridad.Esta es probablemente la peor solución.

Este es trivial hacer en una aplicación web del proyecto, pero supongo que usted está atascado con la Web?

EDITAR: Como una actualización para los comentarios;si yo uso el de Publicar en la Web de la Herramienta, entonces todo el código en app_code va en el directorio bin en una dll llamada App_Code.dll - este comportamiento no cambia incluso si yo uso fijo de nomenclatura (fijos todos los efectos de nomenclatura la nomenclatura de la dll para cada página, usercontrol).Si yo uso ILSpy en este archivo, puedo ver mis clases allí.Así puedo saber el nombre de la asamblea, y su ubicación - yo debería ser capaz de obtener los tipos en que con el mínimo esfuerzo.Me pregunto por qué estoy viendo un comportamiento diferente para usted!

He creado una clase simple llamado "Persona" con un número de Identificación y el Nombre, poner en App_Code, compilado en el sitio, y luego corrió el siguiente código:

  Type myType = Assembly.LoadFrom(Server.MapPath("~/bin/App_Code.dll")).GetType("Person", true);
  Response.Write(myType.ToString());

Él escribió la "Persona", como se esperaba.

Editar Más

La moneda cae!Si yo hago:

  object myObject= Activator.CreateInstance("App_Code.dll", "Person");

Y tratar de arrojar myObject a persona, me sale el siguiente mensaje:

The type 'Person' exists in both 'App_Code.dll' and 'App_Code.jydjsaaa.dll'

Así que es hora de ser tortuoso.

en Global.asax, en Application_OnStart, haga lo siguiente:

Application["App_Code_Assembly"] = Assembly.GetAssembly(typeof(Person));

En mi prueba de página predeterminado, entonces hice:

  Assembly app_Code = Application["App_Code_Assembly"] as Assembly;
  Response.Write(app_Code.FullName);

Lo que me dio el nombre aleatorio app_code que realmente se está ejecutando en el Temporal ASP.Net los Archivos.

Esta es la razón por la que yo odio los Proyectos de Sitio Web ;-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top