Algo de teoría sobre Ensamblados

06/08/2007 - 05:49 por Hugo Nugra | Informe spam
Hola amigos... Ante todo, gracias por su tiempo.

Tengo tres ensamblados: [Llamador], [Trabajo] y [Base]. El ensamblado
[Trabajo] contiene clases que se heredan del ensamblado [Base].

El ensamblado [Llamador] no depende de ninguno de los anteriores, éste
simplemente inicia la ejecución del programa, recupera de algún lugar el
contenido de los ensamblados [Trabajo] y [Base], y los carga en memoria a
través de

byte[] ensambladoBaseData = CargarContenidoDeAssemblyBase()

byte[] ensambladoTrabajoData = CargarContenidoDeAssemblyTrabajo()

Assembly.Load(ensambladoBaseData);

Assembly.Load(ensambladoTrabajoData);

Luego se instancia alguna clase del ensamblado [Trabajo] y la aplicación se
habrá puesto en marcha.

PROBLEMA:

Al cargar en ensamblado [Trabajo], el .Net Framework busca el ensamblado
[Base] en la carpeta de la aplicación, desconoce que ya está cargado en
memoria y al no encontrarlo, lanza un error.

Las cosas funcionan muy bien si [Trabajo] no depende de [Base].
 

Leer las respuestas

#1 Psikotic
07/08/2007 - 21:12 | Informe spam
Tu Assemblie "Base" esta en la carpeta donde esta tu ejecutable?

Si lo cargas remotamente recuerda que debes compilar tu Assemblie con un
"AssemblieKeyFile" para firmarlo (no recuerdo bien el nombre, creo q si es
asi, esta en el archivo AssemblieInfo.cs), para que q el CLR lo cargue en el
GAC. Si no estableces esta propiedad tu programa buscara el Assemblie en la
carpeta donde ejecutas la aplicacion. (como sea firmar un assemblie requiere
mas q solo establecer esta propiedad)

segun se... no es necesario cargar el Assemblie "base" para crear un objeto
"trabajo" como es tu caso, a menos que ocupes un objeto "base" para alguna
otra cosa, tu assemblie "trabajo" tiene una referencia a los assemblies que
ocupa, esta guardado como metadata en el mismo assemblie, por ello si tu
assemblie "base" no esta firmado, el CLR lo buscara en la carpeta de tu
aplicacion, si esta firmado lo buscara en el GAC. espero te sirva


"Hugo Nugra" wrote:

Hola amigos... Ante todo, gracias por su tiempo.

Tengo tres ensamblados: [Llamador], [Trabajo] y [Base]. El ensamblado
[Trabajo] contiene clases que se heredan del ensamblado [Base].

El ensamblado [Llamador] no depende de ninguno de los anteriores, éste
simplemente inicia la ejecución del programa, recupera de algún lugar el
contenido de los ensamblados [Trabajo] y [Base], y los carga en memoria a
través de

byte[] ensambladoBaseData = CargarContenidoDeAssemblyBase()

byte[] ensambladoTrabajoData = CargarContenidoDeAssemblyTrabajo()

Assembly.Load(ensambladoBaseData);

Assembly.Load(ensambladoTrabajoData);

Luego se instancia alguna clase del ensamblado [Trabajo] y la aplicación se
habrá puesto en marcha.

PROBLEMA:

Al cargar en ensamblado [Trabajo], el .Net Framework busca el ensamblado
[Base] en la carpeta de la aplicación, desconoce que ya está cargado en
memoria y al no encontrarlo, lanza un error.

Las cosas funcionan muy bien si [Trabajo] no depende de [Base].



Preguntas similares