Sie sind auf Seite 1von 28

Programar con dominios de aplicacin y ensamblados

Programar con dominios de aplicacin y ensamblados


Los hosts como Microsoft Internet Explorer, ASP.NET y shell de Windows cargan Common Language Runtime en un proceso, crean
un dominio de aplicacin en ese proceso y, a continuacin, cargan y ejecutan el cdigo de usuario en ese dominio de aplicacin al
ejecutar una aplicacin .NET Framework. En la mayora de los casos, no es necesario crear dominios de aplicacin y cargar ensamblados
en ellos porque el host de motor en tiempo de ejecucin realiza esas tareas.
Sin embargo, al crear una aplicacin que alojar al Common Language Runtime, la creacin de herramientas o cdigo que se desean
descargar mediante programacin o de componentes conectables que se pueden descargar y volver a cargar sobre la marcha, significa
que se estn creando dominios de aplicacin propios. Aunque no vaya a crear un host de motor en tiempo de ejecucin, en esta seccin
se ofrece informacin importante sobre el trabajo con dominios de aplicacin y ensamblados cargados en dichos dominios.

1. Utilizar dominios de aplicacin


Los dominios de aplicacin proporcionan una unidad de aislamiento para Common Language Runtime. Se crean y ejecutan dentro de
un proceso. Por lo general, los dominios de aplicacin los crea un host de motor en tiempo de ejecucin, que es una aplicacin
encargada de cargar el motor en tiempo de ejecucin en un proceso y ejecutar el cdigo de usuario dentro de un dominio de
aplicacin. El host de motor en tiempo de ejecucin crea un proceso y un dominio de aplicacin predeterminado y ejecuta el cdigo
administrado en su interior. Entre los hosts de motor en tiempo de ejecucin estn ASP.NET, Microsoft Internet Explorer y el shell de
Windows.
Para la mayora de las aplicaciones, no es necesario crear un dominio de aplicacin propio, ya que el host de motor en tiempo de
ejecucin crea los que sean necesarios. Sin embargo, puede crear y configurar dominios de aplicacin adicionales si su aplicacin
necesita aislar el cdigo o utilizar y descargar archivos DLL.

1.1. Cmo: Crear un dominio de aplicacin


Un host de Common Language Runtime crea dominios de aplicacin automticamente cuando son necesarios. No obstante, el usuario
puede crear sus propios dominios de aplicacin y cargarlos en ensamblados para administrarlos de forma personalizada. Tambin se
pueden crear dominios de aplicacin desde los que se ejecuta cdigo.
Se puede crear un nuevo dominio de aplicacin con los mtodos sobrecargados CreateDomain de la clase System. AppDomain. A un
dominio de aplicacin se le puede dar un nombre, que se usa para hacer referencia al dominio.
En el ejemplo siguiente se crea un nuevo dominio de aplicacin, se le asigna el nombre MyDomain y, a continuacin, se imprime en la
consola el nombre del dominio host y el dominio de aplicacin secundario recin creado.

Ejemplo
using System;
using System.Reflection;
class AppDomain1
{
public static void Main()
{
Console.WriteLine("Creating new AppDomain.");
AppDomain domain = AppDomain.CreateDomain("MyDomain");
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("child domain: " + domain.FriendlyName);
}
}

1.2. Cmo: Descargar un dominio de aplicacin


Cuando se termina de utilizar un dominio de aplicacin, se descarga con el mtodo System.AppDomain.Unload. El
mtodo Unload cierra discretamente el dominio de aplicacin especificado. Durante el proceso de descarga, ningn subproceso nuevo
puede obtener acceso al dominio de aplicacin mientras se liberan todas las estructuras de datos especficas del dominio de la
aplicacin.
Los ensamblados cargados en el dominio de aplicacin se eliminan y dejan de estar disponibles. Si un ensamblado del dominio de
aplicacin es neutral respecto al dominio, sus datos permanecen en la memoria hasta que se cierra todo el proceso. No existe ningn
mecanismo para descargar un ensamblado neutral con respecto al dominio, aparte de cerrar todo el proceso. Hay situaciones en que la
solicitud de descargar un dominio de aplicacin no funciona y genera una Cannot UnloadAppDomainException.
En el ejemplo siguiente se crea un nuevo dominio de aplicacin denominado MyDomain, se imprime cierta informacin en la consola
y, a continuacin, se descarga el dominio de aplicacin. Tenga en cuenta que, despus, el cdigo intenta imprimir en la consola el
nombre descriptivo del dominio de aplicacin descargado. Esta accin genera una excepcin que controlan las instrucciones Try/Catch
que se encuentran al final del programa.

Ejemplo
MCT: Luis Dueas

Pag 1 de 28

Programar con dominios de aplicacin y ensamblados


using System;
using System.Reflection;
class AppDomain2
{
public static void Main()
{
Console.WriteLine("Creating new AppDomain.");
AppDomain domain = AppDomain.CreateDomain("MyDomain", null);
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("child domain: " + domain.FriendlyName);
AppDomain.Unload(domain);
try
{
Console.WriteLine();
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
// The following statement creates an exception because the domain no longer exists.
Console.WriteLine("child domain: " + domain.FriendlyName);
}
catch (AppDomainUnloadedException e)
{
Console.WriteLine("The appdomain MyDomain does not exist.");
}
}
}

1.3. Cmo: Configurar un dominio de aplicacin


Se puede proporcionar a Common Language Runtime informacin de configuracin de un nuevo dominio de aplicacin mediante la
clase AppDomainSetup. Al crear dominios de aplicacin propios, la propiedad ms importante es ApplicationBase. Las dems
propiedades AppDomainSetup las usan principalmente los hosts de motor en tiempo de ejecucin para configurar dominios de
aplicacin concretos.
La propiedad ApplicationBase define el directorio raz de la aplicacin. Cuando el motor en tiempo de ejecucin tiene que satisfacer
una solicitud de tipo, busca el ensamblado que contiene el tipo en el directorio que especifica la propiedad ApplicationBase.

Nota
Un nuevo dominio de aplicacin slo hereda la propiedad ApplicationBase de su correspondiente creador.
En el ejemplo siguiente se crea una instancia de la clase AppDomainSetup, se usa esta clase para crear un nuevo dominio de aplicacin,
se escribe la informacin en la consola y, despus, se descarga el dominio de aplicacin.

Ejemplo
using System;
using System.Reflection;
class AppDomain4
{
public static void Main()
{
// Create application domain setup information.
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = "f:\\work\\development\\latest";
// Create the application domain.
AppDomain domain = AppDomain.CreateDomain("MyDomain", null, domaininfo);
// Write application domain information to the console.
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("child domain: " + domain.FriendlyName);
Console.WriteLine("Application base is: " + domain.SetupInformation.ApplicationBase);
// Unload the application domain.
AppDomain.Unload(domain);
}
}

1.4. Recuperar informacin de instalacin de un dominio de aplicacin


MCT: Luis Dueas

Pag 2 de 28

Programar con dominios de aplicacin y ensamblados


Todas las instancias de un dominio de aplicacin estn formadas por propiedades y por informacin de AppDomainSetup. La
informacin de instalacin se puede recuperar de un dominio de aplicacin mediante la clase System.AppDomain. Esta clase
proporciona varios miembros que recuperan la informacin de configuracin de un dominio de aplicacin.
Tambin se puede consultar el objeto AppDomainSetup del dominio de aplicacin para obtener la informacin de instalacin que se
paso al dominio cuando se cre.
En el ejemplo siguiente se crea un nuevo dominio de aplicacin y, a continuacin, se imprimen varios valores de miembros en la
consola.
using System;
using System.Reflection;
class AppDomain3
{
public static void Main()
{
//Create the new application domain.
AppDomain domain = AppDomain.CreateDomain("MyDomain", null);
//Output to the console.
Console.WriteLine("Host domain: " +
AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("new domain: " + domain.FriendlyName);
Console.WriteLine("Application base is: " +
domain.BaseDirectory);
Console.WriteLine("Relative search path is: " +
domain.RelativeSearchPath);
Console.WriteLine("Shadow copy files is set to: " + domain.ShadowCopyFiles);
AppDomain.Unload(domain);
}
}
En el siguiente ejemplo se establece, y despus se recupera, informacin de instalacin de un dominio de aplicacin. Tenga en cuenta
queAppDomain.SetupInformation.ApplicationBase obtiene la informacin de configuracin.
using System;
using System.Reflection;
class AppDomain5
{
public static void Main()
{
// Application domain setup information.
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = "f:\\work\\development\\latest";
domaininfo.ConfigurationFile = "f:\\work\\development\\latest\\appdomain5.exe.config";
// Creates the application domain.
AppDomain domain = AppDomain.CreateDomain("MyDomain", null, domaininfo);
// Write the application domain information to the console.
Console.WriteLine("Host domain: " + AppDomain.CurrentDomain.FriendlyName);
Console.WriteLine("child domain: " + domain.FriendlyName);
Console.WriteLine();
Console.WriteLine("Application base is: " + domain.SetupInformation.ApplicationBase);
Console.WriteLine("Configuration file is: " +
domain.SetupInformation.ConfigurationFile);
// Unloads the application domain.
AppDomain.Unload(domain);
}
}

1.5. Cmo: Cargar ensamblados en un dominio de aplicacin


Existen varias formas de cargar un ensamblado en un dominio de aplicacin. La forma recomendada es utilizar el
mtodo static (Shared en Visual Basic) Load de la clase System.Reflection.Assembly. Otras formas de cargar ensamblados son las que se
indican a continuacin:
El mtodo LoadFrom de la clase Assembly carga un ensamblado proporcionado su ubicacin de archivo. Este mtodo de
carga de ensamblados utiliza un contexto de carga distinto.

Los mtodos ReflectionOnlyLoad y ReflectionOnlyLoadFrom cargan un ensamblado en el contexto de slo reflexin. Los
ensamblados cargados en este contexto pueden examinarse pero no pueden ejecutarse, lo que permite examinar los
ensamblados destinados a otras plataformas.

MCT: Luis Dueas

Pag 3 de 28

Programar con dominios de aplicacin y ensamblados

Nota
El contexto de slo reflexin es nuevo en la versin 2.0 de .NET Framework.

Los mtodos como CreateInstance y CreateInstanceAndUnwrap de la clase AppDomain permiten cargar ensamblados en un
dominio de aplicacin.
El mtodo GetType de la clase Type puede cargar ensamblados.
El mtodo Load de la clase System.AppDomain puede cargar ensamblados, pero se utiliza principalmente para la
interoperabilidad COM. No debe utilizarse para cargar ensamblados en un dominio de aplicacin distinto del dominio de
aplicacin desde el que se llama al mtodo.

Nota
A partir de la versin 2.0 de .NET Framework, el tiempo de ejecucin no carga ningn ensamblado compilado con un nmero de
versin de .NET Framework mayor que el nmero de versin del tiempo de ejecucin actualmente cargado. Esto se aplica a la
combinacin de los componentes principal y secundario del nmero de versin.
Puede especificar la forma en que el cdigo compilado Just-In-Time (JIT) de los ensamblados cargados se comparte entre los dominios
de aplicacin.

Ejemplo
En el siguiente cdigo, se carga un ensamblado denominado "example.exe" o "example.dll" en el dominio de aplicacin actual, se
obtiene un tipo denominado Example del ensamblado, se obtiene un mtodo sin parmetros denominado MethodA para ese tipo
y se ejecuta el mtodo.
using System;
using System.Reflection;
public class Asmload0
{
public static void Main ()
{
// Use the file name to load the assembly into the current
// application domain.
Assembly a = Assembly.Load("example");
// Get the type to use.
Type myType = a.GetType("Example");
// Get the method to call.
MethodInfo mymethod = myType.GetMethod("MethodA");
// Create an instance.
Object obj = Activator.CreateInstance(myType);
// Execute the method.
mymethod.Invoke(obj,null);
}
}

1.6. Cmo: Obtener informacin sobre tipos y miembros desde un


ensamblado
El espacio de nombres System.Reflection contiene muchos mtodos para obtener informacin de un ensamblado. En esta seccin se
muestra uno de esos mtodos. En el ejemplo siguiente se obtiene informacin de tipo y de miembro de un ensamblado.

Ejemplo
using System;
using System.Reflection;
class Asminfo1
{
public static void Main(string[] args)
{
Console.WriteLine ("\nReflection.MemberInfo");
//Get the Type and MemberInfo.
//Insert the fully qualified class name inside the quotation marks in the following statement.
Type MyType =Type.GetType("System.IO.BinaryReader");

MCT: Luis Dueas

Pag 4 de 28

Programar con dominios de aplicacin y ensamblados


MemberInfo[] Mymemberinfoarray =
MyType.GetMembers(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instan
ce|BindingFlags.DeclaredOnly);
//Get and display the DeclaringType method.
Console.Write("\nThere are {0} documentable members in ", Mymemberinfoarray.Length);
Console.Write("{0}.", MyType.FullName);
foreach (MemberInfo Mymemberinfo in Mymemberinfoarray)
{
Console.Write("\n" + Mymemberinfo.Name);
}
}
}

1.7. Copias sombra de ensamblados


La copia sombra permite actualizar los ensamblados que se utilizan en un dominio de aplicacin sin necesidad de descargar el dominio
de aplicacin. Esto es especialmente til para aplicaciones que deben estar continuamente disponibles, por ejemplo, los sitios ASP.NET.
Common Language Runtime bloquea un archivo de ensamblado cuando se carga el ensamblado, por lo que no se puede actualizar el
archivo hasta que se descargue el ensamblado. La nica manera de descargar un ensamblado de un dominio de aplicacin es
descargando el dominio de aplicacin, por lo que en circunstancias normales, no se puede actualizar un ensamblado en disco hasta que
se hayan descargado todos los dominios de aplicacin que lo estn utilizando.
Cuando se configura un dominio de aplicacin para crear copias sombra de archivos, los ensamblados de la ruta de acceso de la
aplicacin se copian en otra ubicacin y se cargan desde esa ubicacin. La copia est bloqueada pero el archivo de ensamblado original
est desbloqueado y se puede actualizar.

Importante
Los nicos ensamblados de los que se puede crear una copia sombra son aqullos almacenados en el directorio de la aplicacin o
sus subdirectorios, especificados por las propiedades ApplicationBase y PrivateBinPath cuando se configura el dominio de
aplicacin. No se crean copias sombra de los ensamblados almacenados en la cach de ensamblados global.
La lista siguiente describe cmo utilizar las propiedades de la clase AppDomainSetup para configurar un dominio de aplicacin para
crear una copia sombra.

Habilite la creacin de copias sombra estableciendo la propiedad ShadowCopyFiles en el valor de cadena "true".
De forma predeterminada, esto hace que se copien todos los ensamblados de la ruta de acceso de la aplicacin en una cach
de descarga antes de cargarse. sta es la misma cach que Common Language Runtime mantiene para almacenar archivos
descargados de otros equipos y Common Language Runtime elimina automticamente los archivos cuando ya no se
necesitan.

Opcionalmente, establezca una ubicacin personalizada para las copias sombra de archivos mediante las
propiedades CachePath y ApplicationName. La ruta de acceso base de la ubicacin se forma concatenando la
propiedad ApplicationName con la propiedad CachePath como un subdirectorio. Se crea una copia sombra de los
ensamblados en los subdirectorios de esta ruta de acceso, no en la propia ruta de acceso base.

Nota
Si la propiedad ApplicationName no est establecida, se omite la propiedad CachePath y se utiliza la cach de
descarga. No se produce ninguna excepcin.

Si especifica una ubicacin personalizada, deber limpiar los directorios y archivos copiados cuando ya no se necesiten. No se
eliminan automticamente.

Hay dos razones por las que puede desear establecer una ubicacin personalizada para las copias sombra de archivos. Es
posible que necesite establecer una ubicacin personalizada para las copias sombra de archivos si su aplicacin genera un
nmero grande de copias. El tamao, y no el perodo de duracin, limita la cach de descarga, por lo que es posible que
Common Language Runtime intente eliminar un archivo que todava est en uso. Otra razn para establecer una ubicacin
personalizada es cuando los usuarios que ejecutan su aplicacin no tienen acceso de escritura en la ubicacin del directorio
que Common Language Runtime utiliza para la cach de descarga.

Opcionalmente, limite los ensamblados de los que crea una copia sombra mediante la propiedad ShadowCopy Directories.
Al habilitar la copia sombra para un dominio de aplicacin, el valor predeterminado es copiar todos los ensamblados en la
ruta
de
acceso
de
la
aplicacin,
es
decir,
en
los
directorios
especificados
por
las
propiedades ApplicationBase y PrivateBinPath. Puede limitar la copia a los directorios seleccionados creando una cadena
que contiene slo aquellos directorios de los que desea crear una copia sombra y asignando la cadena a la
propiedad ShadowCopyDirectories. Separe los directorios con punto y coma. Los nicos ensamblados de los que se crea una
copia sombra son aqullos que estn en los directorios seleccionados.

MCT: Luis Dueas

Pag 5 de 28

Programar con dominios de aplicacin y ensamblados


Mtodos obsoletos
La clase AppDomain tiene varios mtodos, como SetShadowCopyFiles y ClearShadowCopyPath, que se pueden utilizar para controlar las
copias sombra en un dominio de aplicacin, pero stos se han marcado como obsoletos en la versin 2.0 de .NET Framework. La manera
recomendada de configurar un dominio de aplicacin para crear copias sombra es utilizar las propiedades de la
clase AppDomainSetup.

2. Programar con ensamblados


Los ensamblados son las unidades de creacin de .NET Framework; constituyen la unidad fundamental de implementacin, control de
versin, reutilizacin, mbito de activacin y permisos de seguridad. Los ensamblados proporcionan a Common Language Runtime la
informacin necesaria para conocer las implementaciones de tipos. Son colecciones de tipos y recursos generados para funcionar
conjuntamente y formar una unidad de funcionalidad lgica. Para el motor en tiempo de ejecucin, un tipo no existe si no es en el
contexto de un ensamblado.
En esta seccin se describe cmo se crean mdulos, ensamblados a partir de mdulos y pares de claves, cmo se firma un ensamblado
con un nombre seguro y cmo se instala un ensamblado en la cach de ensamblados global. Adems, se describe cmo se usa
el Desensamblador de MSIL (Ildasm.exe) para ver la informacin del manifiesto del ensamblado.

Nota
Si se inicia con la versin 2.0 de .NET Framework, el tiempo de ejecucin no cargar un ensamblado compilado con una versin
de .NET Framework posterior a la actualmente cargada en el tiempo de ejecucin. Esto se aplica a la combinacin de componentes
principales y secundarios del nmero de versin.

2.1. Crear ensamblados


Se pueden crear ensamblados de un nico archivo o de varios archivos mediante un IDE, como Visual Studio 2005 o mediante los
compiladores y herramientas proporcionados en .NET Framework SDK. El ensamblado ms sencillo es un nico archivo que tiene un
nombre sencillo y se carga en un solo dominio de aplicacin. A este ensamblado no pueden hacer referencia otros ensamblados de
fuera del directorio de la aplicacin. En este ensamblado no se pueden comprobar las versiones. Para desinstalar la aplicacin que forma
el ensamblado, no hay ms que eliminar el directorio en que reside. Muchos programadores no necesitan ms que un ensamblado con
estas caractersticas para implementar una aplicacin.
Se puede crear un ensamblado con varios archivos a partir de varios mdulos de cdigo y archivos de recursos. Tambin se puede crear
un ensamblado que puedan compartir varias aplicaciones. Un ensamblado compartido debe tener un nombre seguro y se puede
implementar en la cach de ensamblados global.
Existen varias opciones para agrupar mdulos de cdigo y recursos en ensamblados, dependiendo de los siguientes factores:

Control de versiones
Agrupe mdulos que deban tener la misma informacin de versin.

Implementacin
Agrupe mdulos de cdigo y recursos compatibles con el modelo de implementacin.

Reutilizacin
Agrupe mdulos si se pueden utilizar juntos de forma lgica con la misma finalidad. Por ejemplo, un ensamblado formado por
tipos y clases que se usan raramente en el mantenimiento de programas se pueden poner en el mismo ensamblado. Adems,
los tipos que se vayan a compartir entre varias aplicaciones se deben agrupar en un ensamblado, que se debe firmar con un
nombre seguro.

Seguridad
Agrupe mdulos que contengan tipos que requieran los mismos permisos de seguridad.

mbito
Agrupe mdulos que contengan tipos que slo pueda ver el mismo ensamblado.
Si los ensamblados de Common Language Runtime van a estar disponibles para aplicaciones COM no administradas hay que tener en
cuenta factores especiales.

2.2. Nombres de ensamblado


El nombre de un ensamblado se almacena en los metadatos y tiene efectos importantes en el mbito del ensamblado y en su uso en
una aplicacin. Un ensamblado con nombre seguro especifica un nombre completo que incluye el nombre del ensamblado, la referencia
cultural, la clave pblica y el nmero de versin. Normalmente se le conoce como el nombre para mostrar y, en el caso de ensamblados
cargados, es posible su obtencin utilizando la propiedad FullName.
El motor en tiempo de ejecucin utiliza esta informacin para localizar el ensamblado y distinguirlo de otros ensamblados con el mismo
nombre. Por ejemplo, un ensamblado con nombre seguro denominado myTypes podra tener el siguiente nombre completo:

myTypes, Version=1.0.1234.0, Culture=en-US, PublicKeyToken=b77a5c561934e089c,


ProcessorArchitecture=msil

MCT: Luis Dueas

Pag 6 de 28

Programar con dominios de aplicacin y ensamblados

Nota
En la versin 2.0 de .NET Framework, se agrega a la identidad del ensamblado a la arquitectura del procesador para permitir
versiones especficas de procesador de ensamblados. Puede crear versiones de un ensamblado cuya identidad slo se diferencia en
la arquitectura del procesador, por ejemplo las versiones especficas del procesador de 32 bits y de 64 bits. La arquitectura del
procesador no es necesaria en los nombres seguros.
En este ejemplo, el nombre completo indica que el ensamblado myTypes tiene un nombre seguro con un smbolo (token) de clave
pblica, que la referencia cultural es ingls de EE.UU. y que el nmero de versin es 1.0.1234.0. La arquitectura del procesador es "msil",
lo que significa que se compilar just-in-time (JIT) a cdigo de 32 bits o 64 bits en funcin del tipo de sistema operativo y de
procesador.
El cdigo que solicita tipos en un ensamblado debe utilizar un nombre de ensamblado completo. Esto se denomina enlace completo.
Cuando se hace referencia a un ensamblado en .NET Framework, no se admite el enlace parcial, ya que slo especifica un nombre de
ensamblado.
Todas las referencias a los ensamblados que componen .NET Framework tambin deben incluir el nombre completo del ensamblado.
Por ejemplo, para hacer referencia al ensamblado System.Data de .NET Framework versin 1.0, habra que incluir lo siguiente:

System.data, version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089


Observe que la versin corresponde al nmero de versin de todos los ensamblados incluidos con .NET Framework 1.0. En los
ensamblados de .NET Framework, el valor de la referencia cultural siempre es neutra y el de clave pblica el mismo que aparece en el
ejemplo anterior.
Por ejemplo, para agregar una referencia de ensamblado a un archivo de configuracin para configurar un agente de escucha de
seguimiento, deber incluir el nombre completo del ensamblado del sistema .NET Framework:

<add name="myListener" type="System.Diagnostics.TextWriterTraceListener, system


version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
initializeData="c:\myListener.log" />
Nota
El motor en tiempo de ejecucin no distingue maysculas y minsculas en los nombres que se enlazan a un ensamblado, pero
conserva lo que se use en el nombre de ensamblado. Hay varias herramientas en el control de nombres del ensamblado de .NET
Framework SDK que distinguen entre maysculas y minsculas. Para obtener mejores resultados, administre los nombres de
ensamblado como si hubiera distincin entre maysculas y minsculas.

Dar nombre a los componentes de aplicaciones


El motor en tiempo de ejecucin no tiene en cuenta el nombre de archivo para determinar la identidad de un ensamblado. La identidad
del ensamblado, formada por el nombre, la versin, la referencia cultural y el nombre seguro del ensamblado, tiene que quedar clara
para el motor en tiempo de ejecucin.
Por ejemplo, si hay un ensamblado denominado myAssembly.exe que hace referencia a un ensamblado denominado myAssembly.dll, el
enlace se produce correctamente si se ejecuta myAssembly.exe. Sin embargo, si otra aplicacin ejecuta myAssembly.exe con el
mtodo AppDomain.ExecuteAssembly, el motor en tiempo de ejecucin determina que "myAssembly" ya est cargado cuando
myAssembly.exe solicita el enlace a "myAssembly." En este caso, myAssembly.dll no se carga nunca. Puesto que myAssembly.exe no
contiene el tipo solicitado, se produce una TypeLoadException.
Para evitar este problema, asegrese de que los ensamblados que forman la aplicacin no tienen el mismo nombre completo de
ensamblado o coloque los ensamblados con el mismo nombre en directorios distintos.

Nota
Si coloca un ensamblado en la cach de ensamblados global, el nombre de archivo del ensamblado debe coincidir con el nombre
del ensamblado, aunque no es necesario que la extensin de nombre de archivo coincida (como .exe o .dll). Por ejemplo, si el
nombre de archivo de un ensamblado es myAssembly.dll, el nombre del ensamblado tiene que ser myAssembly. Los ensamblados
privados que slo se implementan en el directorio de aplicacin raz pueden tener un nombre que no sea el mismo que el nombre
de archivo.

2.3. Cmo: Determinar el nombre completo de un ensamblado


Hay varias formas de obtener el nombre completo de un ensamblado almacenado en la cach de ensamblados global:

Utilice Herramienta Configuracin de .NET Framework (Mscorcfg.msc).

Ver el contenido del directorio de la cach de ensamblados global.


Utilice Herramienta Cach de ensamblados global (Gacutil.exe).
Procedimientos

MCT: Luis Dueas

Pag 7 de 28

Programar con dominios de aplicacin y ensamblados


Para ver los nombres completos de los ensamblados en la cach de ensamblados global mediante la
herramienta Configuracin de .NET Framework
1.

Haga clic en Inicio, seleccione Herramientas administrativas y, a continuacin, haga clic en Configuracin de Microsoft
.NET Framework.
2. Haga clic en Administrar la cach de ensamblados y, a continuacin, haga clic en Ver lista de ensamblados en la cach de
ensamblados.
Para los ensamblados que no se encuentren en la cach de ensamblados global, se puede utilizar cdigo para reproducir esta
informacin en la consola o en una variable; o bien se puede utilizar el Desensamblador de MSIL (Ildasm.exe) para examinar los
metadatos del ensamblado, que contienen el nombre completo.

Ejemplo
En el siguiente ejemplo de cdigo se indica cmo mostrar el nombre completo de un ensamblado que contiene una clase especificada
en la consola.
using System;
using System.Reflection;
class asmname
{
public static void Main()
{
Type t = typeof(System.Data.DataSet);
string s = t.Assembly.FullName.ToString();
Console.WriteLine("The fully qualified assembly name containing the specified class is
{0}.", s);
}
}

2.4. Ubicacin del ensamblado


La ubicacin de un ensamblado determina si Common Language Runtime lo encuentra cuando se hace referencia a l y tambin puede
determinar si otros ensamblados pueden compartirlo. Un ensamblado se puede implementar en las siguientes ubicaciones:

El directorio o subdirectorios de la aplicacin.


Es la ubicacin de implementacin ms frecuente de los ensamblados. Los subdirectorios del directorio raz de una aplicacin
se pueden basar en el idioma o en la referencia cultural. Si un ensamblado tiene informacin en el atributo de referencia
cultural, tiene que estar en un subdirectorio del directorio de la aplicacin con el nombre de esa referencia cultural.

La cach de ensamblados global.


Es una cach de cdigo para todo el equipo que se instala donde est instalado Common Language Runtime. En la mayora
de los casos, si se piensa compartir un ensamblado con varias aplicaciones, habr que instalarlo en la cach de ensamblados
global.

En un servidor FTTP.
Un ensamblado instalado en un servidor FTTP debe tener un nombre seguro, y se seala en la seccin del cdigo base del
archivo de configuracin de la aplicacin.

2.5. Cmo: Generar un ensamblado de un solo archivo


Un ensamblado de un nico archivo, que es el tipo de ensamblado ms sencillo, contiene la informacin e implementacin del tipo,
adems del manifiesto del ensamblado. Para crear un ensamblado de un nico archivo se pueden usar compiladores de la lnea de
comandos o Visual Studio 2005. De forma predeterminada, el compilador crea un archivo de ensamblado con la extensin .exe.

Nota
Visual Studio 2005 para C# y Visual Basic slo se puede utilizar para crear ensamblados de un solo archivo. Si se desea crear
ensamblados de mltiples archivos, se deben usar compiladores de la lnea de comandos o Visual Studio 2005 para Visual C++.
Los procedimientos siguientes muestran cmo se crean ensamblados de un nico archivo mediante compiladores de la lnea de
comandos.

Para crear un ensamblado con la extensin .exe

En el smbolo del sistema, escriba el siguiente comando:


<comando del compilador> <nombre del mdulo>
En este comando, comando del compilador es el comando del compilador para el lenguaje utilizado en el mdulo de cdigo
y nombre del mdulo es el nombre del mdulo de cdigo que se va a compilar en el ensamblado.
En el ejemplo siguiente se crea un ensamblado denominado myCode.exe desde un mdulo de cdigo denominado myCode.
csc myCode.cs

MCT: Luis Dueas

Pag 8 de 28

Programar con dominios de aplicacin y ensamblados


Para crear un ensamblado con una extensin .exe y especificar el nombre del archivo de resultados

En el smbolo del sistema, escriba el siguiente comando:


<comando del compilador> /out:<nombre de archivo> <nombre del mdulo>
En este comando, comando del compilador es el comando del compilador para el lenguaje usado en el mdulo de
cdigo, nombre de archivo es el nombre del archivo de salida y nombre del mdulo es el nombre del mdulo de cdigo que se
va a compilar en el ensamblado.
En el ejemplo siguiente se crea un ensamblado denominado myAssembly.exe desde un mdulo de cdigo
denominado myCode.
csc /out:myAssembly.exe myCode.cs

Crear ensamblados de biblioteca


Un ensamblado de biblioteca es parecido a una biblioteca de clases. Contiene tipos a los que harn referencia otros ensamblados, pero
no tiene un punto de entrada para comenzar la ejecucin.

Para crear un ensamblado de biblioteca


En el smbolo del sistema, escriba el siguiente comando:

<comando del compilador> /t:library <nombre del mdulo>


En este comando, comando del compilador es el comando del compilador para el lenguaje utilizado en el mdulo de cdigo
y nombre del mdulo es el nombre del mdulo de cdigo que se va a compilar en el ensamblado. Tambin se pueden usar
otras opciones de compilador, por ejemplo /out:.
En el ejemplo siguiente se crea un ensamblado de biblioteca denominado myCodeAssembly.dll desde un mdulo de cdigo
denominado myCode.
csc /out:myCodeLibrary.dll /t:library myCode.cs

2.6. Ensamblados de varios archivos


Es posible crear ensamblados de mltiples archivos utilizando compiladores de la lnea de comandos o Visual Studio 2005 con Visual
C++. Uno de los archivos del ensamblado debe contener el manifiesto del ensamblado. Un ensamblado que inicia una aplicacin debe
contener tambin un punto de entrada, como los mtodos Main o WinMain.
Por ejemplo, suponga que hay una aplicacin con dos mdulos de cdigo, Client.cs y Stringer.cs. Stringer.cs que crea el espacio de
nombres myStringer al que se hace referencia en el cdigo de Client.cs. Client.cs contiene el mtodo Main, que es el punto de
entrada de la aplicacin. En este ejemplo, se compilan los dos mdulos de cdigo y, despus, se crea un tercer archivo que contiene el
manifiesto del ensamblado, que inicia la aplicacin. El manifiesto del ensamblado hace referencia a los dos
mdulos,Client y Stringer.

Nota
Los ensamblados de mltiples archivos slo pueden tener un punto de entrada, aunque el ensamblado tenga varios mdulos de
cdigo.
Existen varias razones para crear un ensamblado de varios archivos:

Para combinar mdulos escritos en lenguajes distintos. Esta es la razn ms frecuente para crear ensamblados de varios
archivos.

Para optimizar la descarga de una aplicacin mediante la colocacin de los tipos que se usan poco en un mdulo que slo se
descarga cuando se necesitan.

Nota
Si se van a crear aplicaciones que se descargarn mediante la etiqueta <object> con Microsoft Internet Explorer, es
importante que se creen ensamblados de mltiples archivos. En este caso, se crea un archivo aparte de los mdulos de
cdigo, que contiene slo el manifiesto del ensamblado. Internet Explorer descarga primero el manifiesto del
ensamblado y, a continuacin, crea subprocesos de trabajo para descargar los mdulos o ensamblados adicionales
necesarios. Mientras se est descargando el archivo que contiene el manifiesto del ensamblado, Internet Explorer no
responder a los datos proporcionados por el usuario. Cuanto ms pequeo sea el archivo que contiene el manifiesto,
menos tiempo estar Internet Explorer sin responder al usuario.

Para combinar mdulos de cdigo escritos por varios programadores. Si bien cada programador puede compilar cada mdulo
de cdigo en un ensamblado, esto puede hacer que se expongan pblicamente algunos tipos que no se exponen si todos los
mdulos se ubican en un ensamblado de varios archivos.
Una vez que se ha creado el ensamblado, se puede firmar el archivo que contiene el manifiesto (y, por lo tanto el ensamblado) o se
puede dar al archivo (y al ensamblado) un nombre seguro y colocarlo en la cach de ensamblados global.

2.7. Cmo: Generar un ensamblado de varios archivos

MCT: Luis Dueas

Pag 9 de 28

Programar con dominios de aplicacin y ensamblados


En esta seccin se describe el procedimiento utilizado para crear un ensamblado de mltiples archivos y se proporciona un ejemplo
completo que ilustra cada uno de los pasos del procedimiento.

Para crear un ensamblado de varios archivos


1.

2.
3.

Compile en mdulos de cdigo todos los archivos que contengan espacios de nombres a los que hacen referencia otros
mdulos del ensamblado. La extensin predeterminada de los mdulos de cdigo es .netmodule. Por ejemplo, si un archivo
denominado Stringer crea un espacio de nombres denominado myStringeral que se hace referencia en el cdigo
del archivo Client, Stringer se debera compilar primero en un mdulo de cdigo.
Compile los mdulos restantes, usando las opciones de compilador necesarias para indicar los otros mdulos a los que hace
referencia el cdigo.
Use la herramienta Assembly Linker (Al.exe) para crear el archivo de salida que contiene el manifiesto del ensamblado. Este
archivo contiene informacin de referencia de todos los mdulos o recursos que forman parte del ensamblado.

Nota
El IDE de Visual Studio 2005 para C# y Visual Basic slo se puede utilizar para crear ensamblados de un solo archivo.
Si se desea crear ensamblados de mltiples archivos, se deben usar compiladores de la lnea de comandos o Visual
Studio 2005 con Visual C++.
El ejemplo siguiente muestra el paso 1 del procedimiento anterior, compilando los archivos con espacios de nombres a los que hacen
referencia otros archivos. Este ejemplo comienza con algo de cdigo sencillo para el archivo Stringer. ste tiene un espacio de
nombres denominado myStringer con una clase denominada Stringer. La clase Stringer contiene un mtodo
denominado StringerMethod que escribe una nica lnea en la consola.
// Assembly building example in the .NET Framework.
using System;
namespace myStringer
{
public class Stringer
{
public void StringerMethod()
{
System.Console.WriteLine("This is a line from StringerMethod.");
}
}
}
Use el comando siguiente para compilar este cdigo:
csc /t:module Stringer.cs
Si se especifica el parmetro module con la opcin de compilador /t: se indica que el archivo se debe compilar como un mdulo y no
como un ensamblado. El compilador produce un mdulo denominado Stringer.netmodule, que se puede agregar a un
ensamblado.
En el paso dos del procedimiento anterior, se deben compilar los mdulos con referencias a otros mdulos. En este paso se usa la
opcin de compilador /addmodule. En el siguiente ejemplo, un mdulo de cdigo denominado Client tiene un mtodo Main de
punto de entrada que hace referencia a un mtodo del mdulo Stringer.dllcreado en el paso 1.
En el siguiente ejemplo se muestra el cdigo de Client.
using System;
using myStringer; //The namespace created in Stringer.netmodule.
class MainClientApp
{
// Static method Main is the entry point method.
public static void Main()
{
Stringer myStringInstance = new Stringer();
Console.WriteLine("Client code executes");
//myStringComp.Stringer();
myStringInstance.StringerMethod();
}
}
Use el comando siguiente para compilar este cdigo:
csc /addmodule:Stringer.netmodule /t:module Client.cs
Especifique la opcin /t:module, ya que este mdulo se va a agregar a un ensamblado en un paso posterior. Especifique la
opcin /addmodule, ya que el cdigo deClient hace referencia a un espacio de nombres creado por el cdigo
en Stringer.netmodule. El compilador produce un mdulo denominado Client.netmoduleque contiene una
referencia a otro mdulo, Stringer.netmodule.

MCT: Luis Dueas

Pag 10 de 28

Programar con dominios de aplicacin y ensamblados

Nota
Los compiladores de C# y Visual Basic son compatibles con la creacin directa de ensamblados de mltiples archivos mediante las
dos siguientes sintaxis distintas.

Dos compilaciones crean un ensamblado de dos archivos:


vbc /t:module Stringer.vb
vbc Client.vb /addmodule:Stringer.netmodule
csc /t:module Stringer.cs
csc Client.cs /addmodule:Stringer.netmodule

Una compilacin crea un ensamblado de dos archivos:


vbc /out:Stringer.netmodule Stringer.vb /out:Client.exe Client.vb
csc /out:Client.exe Client.cs /out:Stringer.netmodule Stringer.cs

La herramienta Assembly Linker (Al.exe) se puede usar para crear un ensamblado a partir de una coleccin de mdulos de cdigo
compilados.

Para crear un ensamblado de varios archivos mediante la herramienta Assembly Linker


En el smbolo del sistema, escriba el siguiente comando:

al <nombre del mdulo> <nombre del mdulo> /main:<nombre del mtodo> /out:<nombre de archivo> /target:<tipo de
archivo del ensamblado>
En este comando, los argumentos de nombre de archivo especifican el nombre de todos los mdulos que se van a incluir en el
ensamblado. La opcin /main:especifica el nombre del mtodo que es el punto de entrada del ensamblado. La
opcin /out: especifica el nombre del archivo de salida que contiene metadatos del ensamblado. La opcin /target: especifica
que el ensamblado es un archivo ejecutable de aplicacin de consola (.exe), un archivo ejecutable de Windows (.win) o un
archivo de biblioteca (.lib).
En el siguiente ejemplo, Al.exe crea un ensamblado que es un ejecutable de aplicacin de consola denominado myAssembly.exe.
Esta aplicacin est formada por dos mdulos denominados Client.netmodule y Stringer.netmodule y el archivo
ejecutable denominado myAssembly.exe, que slo contiene metadatos del ensamblado. El punto de entrada del ensamblado
es el mtodo Main de la clase MainClientApp, que se encuentra en Client.dll.

al Client.netmodule Stringer.netmodule /main:MainClientApp.Main /out:myAssembly.exe


/target:exe
Se puede usar el Desensamblador de MSIL (Ildasm.exe) para examinar el contenido de un ensamblado, o determinar si un archivo es un
ensamblado o un mdulo.

2.8. Configurar atributos de ensamblados


Los atributos de ensamblado son valores que proporcionan informacin sobre un ensamblado. Los atributos se dividen en los siguientes
conjuntos de informacin:

Atributos de identidad del ensamblado.


Atributos informativos.
Atributos de manifiesto del ensamblado.
Atributos del nombre seguro

Atributos de identidad del ensamblado


Estos atributos, junto con un nombre seguro (si lo hay), determinan la identidad de un ensamblado: nombre, versin y referencia
cultural. Estos atributos forman el nombre completo del ensamblado y son necesarios para hacer referencia al ensamblado en el cdigo.
Estos atributos se pueden usar para establecer la versin y la referencia cultural de un ensamblado. El compilador o la herramienta
Assembly Linker (Al.exe) establece el valor de nombre cuando se crea el ensamblado, basndose en el archivo que contiene el manifiesto
del ensamblado.
En la tabla siguiente se describen los atributos de versin y referencia cultural.

Atributo de identidad del


ensamblado
AssemblyCultureAttribute

Descripcin
Campo numerado que indica la referencia cultural que admite el ensamblado. En un
ensamblado se puede especificar tambin independencia de referencia cultural, lo que indica
que contiene los recursos para la referencia cultural predeterminada.
Nota

MCT: Luis Dueas

Pag 11 de 28

Programar con dominios de aplicacin y ensamblados

El motor en tiempo de ejecucin trata a los ensamblados que no tienen el atributo de


referencia cultural establecido en null como ensamblado satlite. Estos ensamblados estn
sometidos a las reglas de enlace de ensamblado satlite.
AssemblyFlagsAttribute

Valor que establece atributos del ensamblado, por ejemplo si el ensamblado se puede ejecutar
de forma simultnea.

AssemblyVersionAttribute

Valor numrico con el formato principal.secundario.compilacin.revisin. Por ejemplo,


2.4.0.0. Common Language Runtime usa este valor para realizar operaciones de enlace en
ensamblados de nombre seguro.

En el siguiente ejemplo de cdigo se muestra cmo se aplican los atributos de versin y referencia cultural a un ensamblado.
//Set version number for the assembly.
[assembly:AssemblyVersionAttribute("4.3.2.1")]
//Set culture as German.
[assembly:AssemblyCultureAttribute("de")]

Atributos informativos
Los atributos informativos se pueden usar para proporcionar informacin adicional del producto o de la compaa sobre un
ensamblado. En la siguiente tabla se describen los atributos informativos que se pueden aplicar a un ensamblado.

Atributo informativo

Descripcin

AssemblyCompanyAttribute

Valor de cadena que especifica el nombre de una compaa.

AssemblyCopyrightAttribute

Valor de cadena que especifica la informacin de copyright.

AssemblyFileVersionAttribute

Valor de cadena que especifica el nmero de versin del archivo Win32.


Normalmente, toma como valor predeterminado la versin del ensamblado.

AssemblyInformationalVersionAttribute

Valor de cadena que especifica informacin de versin que no usa el motor en


tiempo de ejecucin, como un nmero completo de versin del producto.

AssemblyProductAttribute

Valor de cadena que especifica informacin del producto.

AssemblyTrademarkAttribute

Valor de cadena que especifica informacin de marca comercial.

Estos atributos pueden aparecer en la pgina de propiedades de Windows del ensamblado, o se pueden sobrescribir con la opcin de
compilador /win32res para especificar un archivo de recursos de Win32 propio.

Atributos de manifiesto del ensamblado


Los atributos de manifiesto del ensamblado se pueden usar para proporcionar informacin del manifiesto del ensamblado, como ttulo,
descripcin, el alias predeterminado y la configuracin. En la tabla siguiente se describen los atributos de manifiesto del ensamblado.

Atributo de manifiesto del


ensamblado

Descripcin

AssemblyConfigurationAttribute

Valor de cadena que indica la configuracin del ensamblado, por ejemplo si se trata de
lanzamiento o de depuracin. El motor en tiempo de ejecucin no utiliza este valor.

AssemblyDefaultAliasAttribute

Valor de cadena que indica el alias predeterminado que utilizarn los ensamblados que
hacen referencia. Este valor proporciona un nombre descriptivo si el nombre del
ensamblado no lo es (por ejemplo, un valor GUID). Este valor se puede usar tambin
como nombre breve del nombre completo del ensamblado.

AssemblyDescriptionAttribute

Valor de cadena que ofrece una breve descripcin que resume la naturaleza y objetivos
del ensamblado.

AssemblyTitleAttribute

Valor de cadena que especifica un nombre descriptivo para el ensamblado. Por ejemplo,
un ensamblado denominado comdlg puede tener el ttulo de Microsoft Common Dialog
Control.

MCT: Luis Dueas

Pag 12 de 28

Programar con dominios de aplicacin y ensamblados


Atributos del nombre seguro
Los atributos del nombre seguro se pueden usar para establecer un nombre seguro para un ensamblado. En la tabla siguiente se
describen los atributos del nombre seguro.

Atributos del nombre


seguro

Descripcin

AssemblyDelaySignAttribute

Valor booleano que indica que se va a retrasar la firma del ensamblado.

AssemblyKeyFileAttribute

Valor de cadena que indica el nombre del archivo que contiene una clave pblica (si se usa
retraso de firma) o tanto la clave pblica como la privada que se pasan como parmetros al
constructor de este atributo. Tenga en cuenta que nombre de archivo es relativo respecto a la
ruta de acceso del archivo de salida (.exe o .dll), no a la del archivo de cdigo fuente.

AssemblyKeyNameAttribute

Especifica el contenedor de claves en que se encuentra el par de claves que se pasa como
parmetro al constructor de este atributo.

En el siguiente ejemplo de cdigo se muestran los atributos que se han de aplicar cuando se usa la firma retrasada para crear un
ensamblado con nombre seguro y con un archivo de clave pblica denominado myKey.snk.
[assembly:AssemblyKeyFileAttribute(@"..\..\myKey.snk")]
[assembly:AssemblyDelaySignAttribute(true)]

2.9. Crear y utilizar ensamblados con nombre seguro


Un nombre seguro consta de la identidad del ensamblado, es decir, de su nombre de texto simple, nmero de versin e informacin
sobre referencia cultural (si se proporciona), ms una clave pblica y una firma digital. Se genera de un archivo de ensamblado mediante
la clave privada correspondiente. El archivo de ensamblado contiene el manifiesto del ensamblado, que contiene los nombres y cdigos
hash de todos los archivos que forman el ensamblado.
Un ensamblado con nombre seguro slo puede utilizar tipos de otros ensamblados con nombre seguro. De lo contrario, se pondra en
peligro la seguridad del ensamblado con nombre seguro.

2.9.1. Escenario de nombre seguro


El siguiente escenario describe el proceso de firma de un ensamblado con un nombre seguro y de hacer, posteriormente, referencia a l
con ese nombre.
1. El ensamblado A se crea con un nombre seguro mediante uno de los mtodos siguientes:
Utilizando un entorno de desarrollo que permita la creacin de nombres seguros, como Visual Studio 2005
1. El entorno de programacin o la herramienta firman el cdigo hash del archivo que contiene el manifiesto del ensamblado
con la clave privada del programador. Esta firma digital se guarda en el archivo ejecutable portable (PE) que contiene el
manifiesto del ensamblado A.
2. El ensamblado B es un consumidor del ensamblado A. La seccin de referencia del manifiesto del ensamblado B contiene un
smbolo (token) que representa la clave pblica del ensamblado A. Un smbolo es una parte de la clave pblica y se usa en
lugar de la propia clave para ahorrar espacio.
3. Common Language Runtime comprueba la firma del nombre seguro cuando se ubica el ensamblado en la cach de
ensamblados global. Cuando se enlaza por nombre seguro en tiempo de ejecucin, Common Language Runtime compara la
clave almacenada en el manifiesto del ensamblado B con la clave utilizada para generar el nombre seguro del ensamblado A.
Si se pasan las comprobaciones de seguridad de .NET Framework y el enlace es correcto, el ensamblado B tiene la garanta de
que los bits del ensamblado A no se han manipulado y proceden sin duda de los programadores del ensamblado A.

Nota
Este escenario no se ocupa de los aspectos de confianza. Los ensamblados pueden llevar firmas completas de
Microsoft Authenticode adems de un nombre seguro. Las firmas de Authenticode incluyen un certificado que
establece la confianza. Es importante recordar que los nombres seguros no requieren que el cdigo se firme de esta
forma. De hecho, las claves utilizadas para generar la firma del nombre seguro no tienen que ser las mismas que se
utilizan para generar una firma de Authenticode.

2.9.2. Cmo: Crear un par de claves privada y pblica


Para firmar un ensamblado con un nombre seguro, es necesario tener un par de claves pblica y privada. Este par de claves
criptogrficas pblica y privada se usa al realizar la compilacin para crear un ensamblado con nombre seguro. Se puede generar un par
de claves utilizando la herramienta Nombre seguro (Sn.exe). Normalmente, los archivos de par de claves tienen la extensin .snk.

Nota

MCT: Luis Dueas

Pag 13 de 28

Programar con dominios de aplicacin y ensamblados

En Visual Studio 2005, los entornos de desarrollo integrado (IDE) de C#, Visual Basic y Visual J# le permiten generar pares de
claves y firmar ensamblados sin necesidad de crear un par de claves mediante Sn.exe. Estos IDE disponen de una ficha Firma en
el Diseador de proyectos. El IDE de Visual C++ le permite especificar la ubicacin de un archivo de clave existente en la pgina
de propiedades Avanzadas, en la seccin Vinculador de la seccin Propiedades de configuracin de la ventana Pginas de
propiedades. El uso de AssemblyKeyFileAttribute para identificar los pares del archivo de clave ha quedado en desuso en Visual
Studio 2005.

Para crear un par de claves

En el smbolo del sistema, escriba el siguiente comando:


sn k <nombre de archivo>
En este comando, nombre de archivo es el nombre del archivo de salida que contiene el par de claves.
En el siguiente ejemplo se crea un par de claves denominado sgKey.snk.

sn -k sgKey.snk
Si se piensa retrasar la firma de un ensamblado y se controla todo el par de claves (lo que es improbable aparte de los escenarios de
pruebas), se pueden usar los comandos siguientes para generar un par de claves y, despus, extraer de l la clave pblica y ponerla en
otro archivo. Primero, cree el par de claves:

sn -k keypair.snk

Despus, extraiga la clave pblica del par de claves y cpiela en otro archivo:

sn -p keypair.snk public.snk

Una vez que haya creado el par de claves, debe ubicar el archivo donde las herramientas de firma de nombre seguro lo
puedan encontrar.
Al firmar un ensamblado con un nombre seguro, la herramienta Assembly Linker (Al.exe) busca el archivo de clave en relacin con el
directorio actual y el directorio de salida. Si se usan compiladores de la lnea de comandos, no hay ms que copiar la clave en el
directorio actual que contenga los mdulos de cdigo.
Si est utilizando una versin anterior de Visual Studio que no cuenta con la ficha Firma en las propiedades de proyecto, la ubicacin
recomendada del archivo de clave es el directorio del proyecto con el atributo de archivo especificado tal y como se muestra a
continuacin:
[assembly: AssemblyKeyFileAttribute(@"..\..\key.snk")]

2.9.3. Cmo: Firmar un ensamblado con un nombre seguro


.NET Framework SDK proporciona varias maneras de firmar un ensamblado con un nombre seguro:

Usando la herramienta Assembly Linker (Al.exe) que proporciona .NET Framework SDK.
Usando atributos de ensamblado para insertar la informacin de nombre seguro en el cdigo. Se puede
usar AssemblyKeyFileAttribute o AssemblyKeyNameAttribute, dependiendo de dnde est ubicado el archivo de clave que se
va a utilizar.

Nota
En la versin 2.0 de .NET Framework, algunos compiladores emiten mensajes de advertencia cuando se utilizan
atributos.

Utilizar las opciones del compilador como /keyfile o /delaysign en C# y Visual Basic, o las opciones del
vinculador /KEYFILE o /DELAYSIGN en C++.

Nota
En Visual Studio 2005, el entorno de desarrollo proporciona las herramientas para firmar los ensamblados.
Es necesario disponer de un par de claves criptogrficas para firmar un ensamblado con un nombre seguro.

Para crear y firmar un ensamblado con un nombre seguro utilizando la herramienta Assembly
Linker

En el smbolo del sistema, escriba el siguiente comando:


al /out:<nombre del ensamblado> <nombre del mdulo> /keyfile:<nombre del archivo>
En este comando, nombre del ensamblado es el nombre del ensamblado que se va a firmar con un nombre seguro, nombre del
mdulo es el nombre del mdulo de cdigo utilizado para crea el ensamblado y nombre de archivo es el nombre del
contenedor o archivo que contiene el par de claves.
En el ejemplo siguiente se firma el ensamblado MyAssembly.dll con un nombre seguro utilizando el archivo de
clave sgKey.snk.

al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk

Para firmar un ensamblado con un nombre seguro utilizando atributos


En un mdulo de cdigo, agregue AssemblyKeyFileAttribute o AssemblyKeyNameAttribute, especificando el nombre del
archivo o contenedor que contiene el par de claves que se debe utilizar al firmar el ensamblado con un nombre seguro.

MCT: Luis Dueas

Pag 14 de 28

Programar con dominios de aplicacin y ensamblados


En el siguiente cdigo de ejemplo, se utiliza el atributo AssemblyKeyFileAttribute con un archivo de claves
denominado sgKey.snk, ubicado en el directorio en el que se compila el ensamblado. Se supone que el ensamblado se compila
utilizando los compiladores de lnea de comandos vbc.exe y csc.exe.
[assembly:AssemblyKeyFileAttribute(@"sgKey.snk")]

Nota
En entornos de desarrollo como Visual Studio, puede que no se compile el ensamblado en el directorio del proyecto. Por ejemplo,
algunas versiones de Visual Studio compilan los proyectos de C# en un subdirectorio bin\Debug. En cuyo caso, la ruta de
acceso en el ejemplo de cdigo sera "..\\..\\sgKey.snk". En Visual Studio 2005 el archivo de claves de C# se puede especificar en
la configuracin del proyecto.
Tambin se puede retrasar la firma de un ensamblado en el momento de la compilacin.
Al firmar un ensamblado con un nombre seguro, la herramienta Assembly Linker (Al.exe) busca el archivo de clave en relacin con el
directorio actual y el directorio de salida. Si se usan compiladores de la lnea de comandos, no hay ms que copiar la clave en el
directorio actual que contenga los mdulos de cdigo.

2.9.4. Cmo: Hacer referencia a un ensamblado con nombre seguro


El proceso para hacer referencia a los tipos o recursos de un ensamblado de nombre seguro es, por lo general, transparente. La
referencia se puede hacer en tiempo de compilacin o en tiempo de ejecucin para permitir el enlace.
Una referencia en tiempo de compilacin se produce cuando se indica al compilador que el ensamblado haga referencia de forma
explcita a otro ensamblado. Cuando se usa la referencia en tiempo de compilacin, el compilador obtiene automticamente la clave
pblica del ensamblado de nombre seguro de destino y la ubica en la referencia al ensamblado del ensamblado que se est
compilando.

Nota
Un ensamblado con nombre seguro slo puede utilizar tipos de otros ensamblados con nombre seguro. De lo contrario, se pondra
en peligro la seguridad del ensamblado con nombre seguro.

Para hacer una referencia en tiempo de compilacin a un ensamblado de nombre seguro

En el smbolo del sistema, escriba el siguiente comando:


<comando del compilador> /reference:<nombre del ensamblado>
En este comando, comando del compilador es el comando del compilador para el lenguaje utilizado y nombre del
ensamblado es el nombre del ensamblado de nombre seguro al que se hace referencia. Tambin se pueden usar otras
opciones de compilador, por ejemplo la opcin /t:library para crear un ensamblado de biblioteca.
En el ejemplo siguiente se crea un ensamblado denominado myAssembly.dll que hace referencia a un ensamblado de nombre
seguro denominadomyLibAssembly.dll desde un mdulo de cdigo denominado myAssembly.cs.

csc /t:library myAssembly.cs /reference:myLibAssembly.dll

Para hacer una referencia en tiempo de ejecucin a un ensamblado de nombre seguro

Cuando se hace una referencia en tiempo de ejecucin a un ensamblado con nombre seguro, por ejemplo utilizando los
mtodos Assembly.Load o Assembly.GetType, es necesario utilizar el nombre para mostrar del ensamblado con nombre
seguro al que se hace referencia. La sintaxis de un nombre para mostrar es:
<nombre del ensamblado>, <nmero de versin>, <referencia cultural>, <smbolo de clave pblica>
Por ejemplo:

myDll, Version=1.1.0.0, Culture=en, PublicKeyToken=03689116d3a4ae33


En este ejemplo, PublicKeyToken es la forma hexadecimal del smbolo de la clave pblica. Si no hay ningn valor de referencia cultural,
utilice Culture=neutral.
En el ejemplo de cdigo siguiente se muestra cmo se utiliza esta informacin con el mtodo Assembly.Load.
Assembly.Load("myDll,Version=1.0.0.1,Culture=neutral,PublicKeyToken=9b35aa32c18d4fb1");
Se puede imprimir el formato hexadecimal de la clave pblica y del smbolo de la clave pblica de un ensamblado concreto mediante el
siguiente comando de la herramienta Nombre seguro (Sn.exe):
sn -Tp <ensamblado>
Si se tiene un archivo de clave pblica, se puede utilizar el siguiente comando (advierta la diferencia entre maysculas y minsculas en la
opcin de la lnea de comandos):
sn -tp <ensamblado>

2.10. Retrasar la firma de un ensamblado


Una organizacin puede tener un par de claves muy bien guardado al que los programadores no tiene acceso todos los das. La clave
pblica est disponible con frecuencia, pero la clave privada est restringida slo a algunas personas. Al programar ensamblados con

MCT: Luis Dueas

Pag 15 de 28

Programar con dominios de aplicacin y ensamblados


nombre seguro, cada ensamblado que hace referencia al ensamblado con nombre seguro de destino contiene el smbolo de la clave
pblica que se usa para dar al ensamblado de destino un nombre seguro. Ello requiere que la clave pblica est disponible durante el
proceso de programacin.
Se puede usar el retraso de firma o firma parcial en tiempo de generacin para reservar espacio en el archivo ejecutable portable (PE)
para la firma de nombre seguro, pero la firma en s se retrasa hasta ms adelante, normalmente justo antes del envo del ensamblado.
Los pasos siguientes describen el proceso de retraso de la firma de un ensamblado:
1. Obtenga la parte de clave pblica del par de claves de la organizacin que, en su momento, llevar a cabo la firma.
Normalmente, esta clave es un archivo .snk, que se puede crear con la herramienta Nombre seguro (Sn.exe) que proporciona
.NET Framework SDK.
2. Agregue al cdigo fuente del ensamblado dos atributos personalizados de System.Reflection:
o AssemblyKeyFileAttribute, que pasa el nombre del archivo que contiene la clave pblica como parmetro a su
constructor.
o AssemblyDelaySignAttribute, que indica que se va a utilizar el retraso de firma pasando true como parmetro a su
constructor. Por ejemplo:
[assembly:AssemblyKeyFileAttribute("myKey.snk")]
[assembly:AssemblyDelaySignAttribute(true)]
3. El compilador inserta la clave pblica en el manifiesto del ensamblado y reserva espacio en el archivo PE para la firma de
nombre seguro completa. La clave pblica autntica se debe guardar mientras se genera el ensamblado para que otros
ensamblados que hagan referencia a ste puedan obtenerla y guardarla en su propia referencia al ensamblado.
4. Como el ensamblado no tiene una firma de nombre seguro vlida, hay que desactivar la comprobacin de esa firma. Esto se
hace utilizando la opcin Vr con la herramienta Nombre seguro.
En el ejemplo siguiente se desactiva la comprobacin para un ensamblado denominado myAssembly.dll.

sn Vr myAssembly.dll
Precaucin
Utilice la opcin -Vr slo durante la programacin. Al agregar un ensamblado a la lista de omisiones de comprobacin
se produce una vulnerabilidad en la seguridad. Puede que un ensamblado malicioso utilice el nombre completo
especificado (nombre de ensamblado, versin, referencia cultural y smbolo de clave pblica) del ensamblado existente
en la lista de omisiones de comprobacin para imitar su identidad. Esto permitira que el ensamblado malicioso se
pasase tambin por alto durante la comprobacin.
5.

Posteriormente, por lo general justo antes del envo, el ensamblado se entrega a la autoridad de firma de la organizacin para
que lleve a cabo la firma de nombre seguro propiamente dicha, utilizando la opcin R con la herramienta Nombre seguro.
En el ejemplo siguiente se firma el ensamblado myAssembly.dll con un nombre seguro utilizando el par de claves sgKey.snk.

sn -R myAssembly.dll sgKey.snk

2.11. Trabajar con ensamblados y la Cach de ensamblados global


Si se piensa compartir un ensamblado entre varias aplicaciones, puede instalarlo en la cach de ensamblados global. Cada equipo tiene
esta memoria cach de cdigo donde se instala Common Language Runtime. La cach de ensamblados global almacena los
ensamblados designados especficamente para ser compartidos por varias aplicaciones del equipo. Un ensamblado debe tener un
nombre seguro para que se pueda instalar en la cach de ensamblados global.

Nota
Los ensamblados ubicados en la cach de ensamblados global deben tener el mismo nombre de ensamblado y de archivo, sin
contar la extensin de nombre de archivo. Por ejemplo, un ensamblado con el nombre de ensamblado myAssembly debe tener un
nombre de archivo myAssembly.exe o myAssembly.dll.
Se recomienda compartir los ensamblados mediante su instalacin en la cach de ensamblados global slo cuando sea necesario. Como
norma general, mantenga las dependencias de los ensamblados privadas y coloque los ensamblados en el directorio de la aplicacin, a
menos que sea necesario compartir un ensamblado en concreto. Adems, no es necesario instalar los ensamblados en la cach de
ensamblados global para que pueda tener acceso a ellos el cdigo de interoperabilidad COM o el cdigo no administrado.
Existen varias razones para instalar un ensamblado en la cach de ensamblados global:

Ubicacin compartida.
Los ensamblados que van a usar las aplicaciones se pueden poner en la cach de ensamblados global. Por ejemplo, si todas
las aplicaciones deben usar un ensamblado ubicado en la cach de ensamblados global, se puede agregar una instruccin de
directiva de versin al archivo Machine.config que redirige las referencias al ensamblado.

Seguridad de archivos.
Con frecuencia, los administradores protegen el directorio systemroot con una Lista de control de acceso (ACL) para controlar
el acceso de escritura y ejecucin. Puesto que la cach de ensamblados global est instalada en el directorio systemroot,
hereda la lista (ACL) de dicho directorio. Es recomendable que slo puedan eliminar archivos de la cach de ensamblados
global los usuarios que tengan privilegios de administrador.

Control de versiones simultneas.

MCT: Luis Dueas

Pag 16 de 28

Programar con dominios de aplicacin y ensamblados


En la cach de ensamblados global se pueden guardar muchas copias de ensamblados con el mismo nombre pero con
distinta informacin de versin.
Ubicacin de bsqueda adicional.
Common Language Runtime busca en la cach de ensamblados global un ensamblado que coincida con la solicitud de
ensamblado antes de buscar o utilizar la informacin de cdigo base en un archivo de configuracin.
Tenga en cuenta que hay escenarios en los que no desear instalar un ensamblado en la memoria cach de ensamblados global. Si
coloca uno de los ensamblados que componen una aplicacin en la memoria cach de ensamblados global, ya no podr replicar ni
instalar la aplicacin utilizando XCOPY para copiar el directorio de la aplicacin. En este caso, debe mover tambin el ensamblado a la
cach de ensamblados global.

2.11.1. Cmo: Instalar un ensamblado en la Cach de ensamblados global


Describe las cuatro formas de instalar un ensamblado en la cach de ensamblados global:

Utilizar la herramienta Cach de ensamblados global (Gacutil.exe).


Gacutil.exe se puede utilizar para agregar ensamblados con nombre seguro a la cach de ensamblados global y ver el
contenido de dicha cach.

Nota
Gacutil.exe slo debe usarse para programacin y no para instalar ensamblados de produccin en la cach de
ensamblados global.

Utilizar Microsoft Windows Installer 2.0.


Esta es la forma recomendada y ms normal de agregar ensamblados a la cach de ensamblados global. El instalador
proporciona el recuento de referencias de los ensamblados de la cach de ensamblados global, adems de otras ventajas.
Utilizar una extensin shell de Windows proporcionada por .NET Framework SDK denominada Visor de la cach de
ensamblados (Shfusion.dll).
La extensin shell permite arrastrar ensamblados a la cach de ensamblados global.
Utilizar Herramienta Configuracin de .NET Framework (Mscorcfg.msc).
Herramienta Configuracin de .NET Framework (Mscorcfg.msc) permite ver la cach de ensamblados global y agregarle
nuevos ensamblados.

Para instalar un ensamblado con nombre seguro en la cach de ensamblados global utilizando
la herramienta Cach de ensamblados global (Gacutil.exe)

En el smbolo del sistema, escriba el siguiente comando:


gacutil I <nombre del ensamblado>
En este comando, nombre del ensamblado es el nombre del ensamblado que se va a instalar en la cach de ensamblados
global.
En el ejemplo siguiente se instala un ensamblado con el nombre de archivo hello.dll en la cach de ensamblados global.

gacutil -i hello.dll

2.11.2. Cmo: Consultar el contenido de la Cach de ensamblados global


Use la herramienta Cach de ensamblados global (Gacutil.exe) para ver el contenido de la cach de ensamblados global.

Para ver una lista de los ensamblados de la cach de ensamblados global

En el smbolo del sistema, escriba el siguiente comando:


gacutil l
.NET Framework SDK proporciona tambin una extensin del shell de Windows denominada Visor de la cach de ensamblados
(Shfusion.dll), que se puede utilizar para ver el contenido de la cach de ensamblados global.

2.11.3. Cmo: Quitar un ensamblado de la Cach de ensamblados global


Use la herramienta Cach de ensamblados global (Gacutil.exe) para quitar un ensamblado de la cach de ensamblados global.

Para quitar un ensamblado de la cach de ensamblados global

En el smbolo del sistema, escriba el siguiente comando:


gacutil I <nombre del ensamblado>
En este comando, nombre del ensamblado es el nombre del ensamblado que se va a quitar de la cach de ensamblados
global.
En el ejemplo siguiente se quita el ensamblado denominado hello.dll de la cach de ensamblados global.

gacutil -u hello

MCT: Luis Dueas

Pag 17 de 28

Programar con dominios de aplicacin y ensamblados


.NET Framework SDK proporciona tambin una extensin del shell de Windows denominada Visor de la cach de ensamblados
(Shfusion.dll), que se puede utilizar para quitar ensamblados de la cach de ensamblados global.

2.11.4. Utilizar componentes con servicio junto con la Cach de


ensamblados global
Los componentes con servicio (componentes COM+ de cdigo administrado) se deben colocar en la cach de ensamblados global. En
algunos escenarios, Common Language Runtime y los Servicios COM+ pueden controlar componentes con servicio que no estn en la
cach de ensamblados global, pero en otros escenarios no pueden hacerlo. Esto se ilustra en los siguientes escenarios.
Para los componentes con servicio de una aplicacin de servidor COM+, el ensamblado que contiene los componentes debe
estar en la cach de ensamblados global porque Dllhost.exe no se ejecuta en el mismo directorio que el que contiene los
componentes con servicio.

Para los componentes con servicio de una aplicacin de biblioteca COM+, el motor en tiempo de ejecucin y los Servicios
COM+ pueden resolver la referencia al ensamblado que contiene los componentes haciendo una bsqueda en el directorio
actual. En este caso, no hace falta que el ensamblado est en la cach de ensamblados global.

Para los componentes con servicio de una aplicacin de ASP.NET, la situacin es distinta. Si el ensamblado que contiene los
componentes con servicio se ubica en el directorio bin en la base de aplicacin y se utiliza el registro a peticin, se har una
copia en segundo plano del ensamblado en la cach de descarga porque ASP.NET aprovecha las capacidades de copia del
motor en tiempo de ejecucin.

2.12. Cmo: Ver el contenido de un ensamblado


El Desensamblador de MSIL (Ildasm.exe) se puede usar para ver la informacin del lenguaje intermedio de Microsoft (MSIL) de un
archivo. Si el archivo que se examina es un ensamblado, esta informacin puede incluir los atributos de dicho ensamblado, as como
referencias a otros mdulos y ensamblados. Esta informacin puede resultar til para determinar si el archivo es un ensamblado o parte
de un ensamblado y si tiene referencias a otros mdulos o ensamblados.

Para mostrar el contenido de un ensamblado mediante Ildasm.exe

Escriba ildasm <nombre de ensamblado> en el smbolo del sistema. Por ejemplo, con el comando siguiente se desensambla el
ensamblado Hello.exe.

ildasm Hello.exe

Para ver informacin de manifiesto de ensamblado

Haga doble clic en el icono del MANIFIESTO en la ventana del Desensamblador MSIL.

Ejemplo
El siguiente ejemplo empieza con un programa bsico "Hola a todos". Despus de compilar el programa, utilice Ildasm.exe para
desensamblar el ensamblado Hello.exe y ver el manifiesto de ensamblado.
using System;
class MainApp {
public static void Main() {
Console.WriteLine("Hello World using C#!");
}
}
La ejecucin del comando ildasm.exe en el ensamblado Hello.exe y un doble clic en el icono del MANIFIESTO en la ventana de IL DASM
generan el resultado siguiente:

.assembly extern mscorlib


{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )
// .z\V.4..
.ver 1:0:2411:0
}
.assembly Hello
{
// --- The following custom attribute is added automatically; do not uncomment. ------// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
//
bool)
= ( 01 00 00 01 00 00 )
.hash algorithm 0x00008004
.ver 0:0:0:0
}
.module Hello.exe
// MVID: {58AD9DFD-63A6-462A-8AD5-42CBC95AA147}

MCT: Luis Dueas

Pag 18 de 28

Programar con dominios de aplicacin y ensamblados


.subsystem 0x00000003
.file alignment 512
.corflags 0x00000001
// Image base: 0x03330000
En la siguiente tabla se describen las directivas del manifiesto del ensamblado Hello.exe utilizado en el ejemplo.

Directiva

Descripcin

.assembly extern < nombre del


ensamblado >

Especifica otro ensamblado que contiene elementos a los que hace referencia el mdulo
actual (en este ejemplo, mscorlib).

.publickeytoken < token >

Especifica el smbolo de la clave real del ensamblado al que se hace referencia.

.ver < nmero de versin >

Especifica el nmero de versin del ensamblado al que se hace referencia.

.assembly < nombre del


ensamblado >

Especifica el nombre del ensamblado.

.hash algorithm < valor int32 >

Especifica el algoritmo de hash utilizado.

.ver < nmero de versin >

Especifica el nmero de versin del ensamblado.

.module < nombre de archivo >

Especifica el nombre de los mdulos que forman el ensamblado. En este ejemplo, el


ensamblado slo tiene un archivo.

.subsystem < valor >

Especifica el entorno de aplicacin que requiere el programa. En este ejemplo, el valor 3


indica que este ejecutable se ejecuta desde una consola.

.corflags

En la actualidad, un campo reservado de los metadatos.

Un manifiesto de ensamblado puede contener varias directivas distintas, dependiendo del contenido del ensamblado. Para obtener una
lista completa de las directivas del manifiesto de ensamblado, consulte la documentacin (en ingls) de ECMA, especialmente la
particin II, sobre definicin y semntica de metadatos, y la particin III, sobre el conjunto de instrucciones de CIL. La documentacin
est disponible en lnea en http://msdn.microsoft.com/net/ecma/ y http://www.ecma-international.org/publications/standards/Ecma335.htm.

2.13. Reenvo de tipos en Common Language Runtime


El reenvo de tipos le permite mover un tipo a otro ensamblado sin tener que volver a compilar las aplicaciones que utilizan el
ensamblado original.
Por ejemplo, supongamos que una aplicacin utiliza la clase Example en un ensamblado denominado Utility.dll. Los
desarrolladores de Utility.dll podran decidir refactorizar el ensamblado y, en el proceso, podran mover la clase Example a
otro ensamblado. Si se reemplaza la versin antigua de Utility.dll por la nueva versin de Utility.dll y su ensamblado
complementario, se producir un error en la aplicacin que utiliza la clase Example porque no podr localizar la clase Example en
la nueva versin de Utility.dll.
Los desarrolladores de Utility.dll pueden evitarlo reenviando solicitudes a la clase Example mediante el
atributo TypeForwardedToAttribute. Si el atributo ya se ha aplicado a la nueva versin de Utility.dll, las solicitudes a la
clase Example se reenviarn al ensamblado que en estos momentos contenga la clase. La aplicacin existente continuar
funcionando normalmente, sin volver a compilarse.

Nota
En la versin 2.0 de .NET Framework, no pueden reenviarse tipos de ensamblados escritos en Visual Basic. Pero una aplicacin
escrita en Visual Basic puede utilizar tipos reenviados. Es decir, si la aplicacin utiliza un ensamblado codificado en C# o C++ y
un tipo de ese ensamblado se reenva a otro ensamblado, la aplicacin de Visual Basic puede utilizar el tipo reenviado.

Reenviar tipos
Para reenviar un tipo, hay que seguir cuatro pasos:
1. Mueva el cdigo fuente del tipo del ensamblado original al ensamblado de destino.
2. En el ensamblado donde antes estaba localizado el tipo, agregue TypeForwardedToAttribute al tipo que se ha movido. En el
siguiente cdigo se muestra el atributo para un tipo denominado Example que se ha movido.

MCT: Luis Dueas

Pag 19 de 28

Programar con dominios de aplicacin y ensamblados

3.
4.

[assembly:TypeForwardedToAttribute(typeof(Example))]
Compile el ensamblado que en estos momentos contenga el tipo.
Vuelva a compilar el ensamblado donde antes estaba localizado el tipo, con una referencia al ensamblado que en estos
momentos contenga el tipo. Por ejemplo, si est compilando un archivo de C# desde la lnea de comandos, utilice la
opcin /reference (Importar metadatos) (Opciones del compilador de C#) para especificar el ensamblado que contiene el tipo.
En C++, utilice la directiva #using del archivo de cdigo fuente para especificar el ensamblado que contiene el tipo.

3. Clase AppDomain
Representa un dominio de aplicacin, que es un entorno aislado donde se ejecutan las aplicaciones. Esta clase no puede heredarse.

Jerarqua de herencia
System.Object
System.MarshalByRefObject
System.AppDomain
Espacio de nombres: System
Ensamblado: mscorlib (en mscorlib.dll)

Sintaxis
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public sealed class AppDomain : MarshalByRefObject,
_AppDomain, IEvidenceFactory
El tipo AppDomain expone los siguientes miembros.

Propiedades
Nombre

Descripcin

ActivationContext

Obtiene el contexto de activacin para el dominio de aplicacin actual.

ApplicationIdentity

Obtiene la identidad de la aplicacin en el dominio de aplicacin.

ApplicationTrust

Obtiene informacin que describe los permisos concedidos a una aplicacin y si


la aplicacin tiene un nivel de confianza que le permita ejecutarse.

BaseDirectory

Obtiene el directorio base que el interpretador de ensamblados utiliza para


buscar ensamblados.

CurrentDomain

Obtiene el actual dominio de aplicacin del actual Thread.

DomainManager

Obtiene el administrador de dominio que ha proporcionado el host al inicializar


el dominio de aplicacin.

DynamicDirectory

Obtiene el directorio que el interpretador de ensamblados utiliza para buscar


ensamblados creados de forma dinmica.

Evidence

Obtiene el Evidence asociado al dominio de la aplicacin.

FriendlyName

Obtiene el nombre descriptivo de este dominio de aplicacin.

Id

Obtiene un entero que identifica nicamente el dominio de aplicacin en el


proceso.

IsFullyTrusted

Obtiene un valor que indica si los ensamblados que se cargan en el dominio de


aplicacin actual se ejecutan con plena confianza.

IsHomogenous

Obtiene un valor que indica si el dominio de aplicacin actual tiene un conjunto


de permisos concedido a todos los ensamblados que se cargan en el dominio de
aplicacin.

MCT: Luis Dueas

Pag 20 de 28

Programar con dominios de aplicacin y ensamblados

MonitoringIsEnabled

Obtiene o establece un valor que indica si la supervisin de la CPU y de la


memoria del dominio de aplicacin est habilitada para el proceso actual. Una
vez que se habilita la supervisin para un proceso, no se puede deshabilitar.

MonitoringSurvivedMemorySize

Obtiene el nmero de bytes que sobrevivieron a la ltima recoleccin y a la que


se sabe que hace referencia el dominio de aplicacin actual.

MonitoringSurvivedProcessMemorySize

Obtiene los bytes totales que sobrevivieron a la ltima recoleccin para todos
los dominios de aplicacin del proceso.

MonitoringTotalAllocatedMemorySize

Obtiene el tamao total, en bytes, de todas las asignaciones de memoria


realizadas por el dominio de aplicacin desde que se cre, sin restar la memoria
recopilada.

MonitoringTotalProcessorTime

Obtiene el tiempo total de procesador usado por todos los subprocesos mientras
se ejecutaban en el dominio de aplicacin actual, desde que el proceso se inici.

PermissionSet

Obtiene el conjunto de permisos de un dominio de aplicacin en un espacio


aislado.

RelativeSearchPath

Obtiene la ruta de acceso del directorio base en que el interpretador de


ensamblados debe buscar ensamblados privados.

SetupInformation

Obtiene la informacin de configuracin del dominio de aplicacin


correspondiente a esta instancia.

ShadowCopyFiles

Obtiene una indicacin si el dominio de aplicacin se configura para archivos de


instantnea.

Mtodos
Nombre

Descripcin

AppendPrivatePath

Obsoleto. Anexa el nombre de directorio especificado a la lista de rutas


de acceso privadas.

ApplyPolicy

Devuelve el nombre para mostrar del ensamblado despus de aplicar la


directiva.

ClearPrivatePath

Obsoleto. Restablece la ruta de acceso que especifica la ubicacin de


ensamblados privados en la cadena vaca ("").

ClearShadowCopyPath

Obsoleto. Restablece la lista de directorios que contienen copias sombra


de ensamblados en la cadena vaca ("").

CreateComInstanceFrom(String, String)

Crea una nueva instancia de un tipo COM especificado. Los parmetros


especifican el nombre de un archivo que contiene un ensamblado con el
tipo y el nombre del tipo.

CreateComInstanceFrom(String, String,Byte[],
AssemblyHashAlgorithm)

Crea una nueva instancia de un tipo COM especificado. Los parmetros


especifican el nombre de un archivo que contiene un ensamblado con el
tipo y el nombre del tipo.

CreateDomain(String)

Crea un nuevo dominio de aplicacin con el nombre especificado.

CreateDomain(String, Evidence)

Crea un nuevo dominio de aplicacin con el nombre especificado


mediante la evidencia proporcionada.

CreateDomain(String, Evidence,
AppDomainSetup)

Crea un nuevo dominio de aplicacin con el nombre especificado, la


evidencia indicada y la correspondiente informacin de configuracin.

MCT: Luis Dueas

Pag 21 de 28

Programar con dominios de aplicacin y ensamblados

CreateDomain(String, Evidence,
AppDomainSetup,
PermissionSet,StrongName[])

Crea un nuevo dominio de aplicacin utilizando el nombre, la evidencia,


la informacin de configuracin del dominio de aplicacin, el conjunto
predeterminado de permisos y la matriz de ensamblados de plena
confianza que se hayan especificado.

CreateDomain(String, Evidence, String, String,


Boolean)

Crea un nuevo dominio de aplicacin con el nombre especificado


utilizando la evidencia, la ruta de acceso base de la aplicacin, la ruta de
bsqueda relativa y un parmetro que especifica si debe cargarse una
instantnea de un ensamblado en el dominio de aplicacin.

CreateDomain(String, Evidence, String, String,


Boolean, AppDomainInitializer,String[])

Crea un nuevo dominio de aplicacin con el nombre especificado


utilizando la evidencia, la ruta de acceso base de la aplicacin, la ruta de
bsqueda relativa y un parmetro que especifica si debe cargarse una
instantnea de un ensamblado en el dominio de aplicacin. Especifica un
mtodo de devolucin de llamada que se invoca cuando se inicializa el
dominio de aplicacin, as como una matriz de argumentos de cadena
para pasar al mtodo de devolucin de llamada.

CreateInstance(String, String)

Crea una nueva instancia del tipo especificado definido en el ensamblado


especificado.

CreateInstance(String, String, Object[])

Crea una nueva instancia del tipo especificado definido en el ensamblado


especificado. Un parmetro especifica una matriz de atributos de
activacin.

CreateInstance(String, String, Boolean,


BindingFlags, Binder, Object[],
CultureInfo,Object[])

Crea una nueva instancia del tipo especificado definido en el ensamblado


especificado. Los parmetros especifican un enlazador, marcas de enlace,
argumentos de constructor, informacin especfica de la referencia
cultural usada para interpretar argumentos y atributos de activacin
opcionales.

CreateInstance(String, String, Boolean,


BindingFlags, Binder, Object[],
CultureInfo,Object[], Evidence)

Obsoleto. Crea una nueva instancia del tipo especificado definido en el


ensamblado especificado. Los parmetros establecen un enlazador,
marcas de enlace, argumentos de constructor, informacin especfica de
la referencia cultural utilizada para interpretar argumentos, atributos de
activacin y autorizacin para crear el tipo.

CreateInstanceAndUnwrap(String, String)

Crea una nueva instancia del tipo especificado. Los parmetros


especifican el ensamblado en el que se definen el tipo y el nombre del
tipo.

CreateInstanceAndUnwrap(String,
String,Object[])

Crea una nueva instancia del tipo especificado. Los parmetros


especifican el ensamblado en el que se definen el tipo, el nombre del tipo
y una matriz de atributos de activacin.

CreateInstanceAndUnwrap(String, String,
Boolean, BindingFlags, Binder, Object[],
CultureInfo, Object[])

Crea una nueva instancia del tipo especificado definido en el ensamblado


indicado, especificando si se pasa por alto el modelo de maysculas y
minsculas del nombre de tipo, los atributos de enlace y el enlazador que
se usan para seleccionar el tipo que se va a crear, los argumentos del
constructor, la referencia cultural y los atributos de activacin.

CreateInstanceAndUnwrap(String, String,
Boolean, BindingFlags, Binder, Object[],
CultureInfo, Object[], Evidence)

Obsoleto. Crea una nueva instancia del tipo especificado. Los parmetros
especifican el nombre del tipo as como la forma en que se ha encontrado
y se ha creado.

CreateInstanceFrom(String, String)

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado especificado.

CreateInstanceFrom(String, String,Object[])

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado especificado.

CreateInstanceFrom(String, String, Boolean,


BindingFlags, Binder, Object[],

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado especificado.

MCT: Luis Dueas

Pag 22 de 28

Programar con dominios de aplicacin y ensamblados

CultureInfo, Object[])
CreateInstanceFrom(String, String, Boolean,
BindingFlags, Binder, Object[],
CultureInfo, Object[], Evidence)

Obsoleto. Crea una nueva instancia del tipo especificado definido en el


archivo de ensamblado especificado.

CreateInstanceFromAndUnwrap(String,
String)

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado especificado.

CreateInstanceFromAndUnwrap(String,
String, Object[])

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado especificado.

CreateInstanceFromAndUnwrap(String, String,
Boolean, BindingFlags, Binder,Object[],
CultureInfo, Object[])

Crea una nueva instancia del tipo especificado definido en el archivo de


ensamblado indicado, especificando si se pasa por alto el modelo de
maysculas y minsculas del nombre de tipo, los atributos de enlace y el
enlazador que se usan para seleccionar el tipo que se va a crear, los
argumentos del constructor, la referencia cultural y los atributos de
activacin.

CreateInstanceFromAndUnwrap(String, String,
Boolean, BindingFlags, Binder,Object[],
CultureInfo, Object[], Evidence)

Obsoleto. Crea una nueva instancia del tipo especificado definido en el


archivo de ensamblado especificado.

CreateObjRef

Crea un objeto que contiene toda la informacin relevante necesaria para


generar un proxy utilizado para comunicarse con un objeto remoto. (Se
hereda de MarshalByRefObject).

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess)

Define un ensamblado dinmico con el nombre y modo de acceso


especificados.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess,
IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinmico con el nombre especificado, el modo de


acceso y los atributos personalizados.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, Evidence)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso y la evidencia.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String)

Define un ensamblado dinmico utilizando el nombre especificado, el


modo de acceso y el directorio de almacenamiento.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess,
IEnumerable<CustomAttributeBuilder>,
SecurityContextSource)

Define un ensamblado dinmico con el nombre, el modo de acceso y los


atributos personalizados especificados, y usando el origen indicado para
su contexto de seguridad.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso, el directorio de almacenamiento y la
evidencia.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, PermissionSet,
PermissionSet, PermissionSet)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Boolean,
IEnumerable<CustomAttributeBuilder>)

Define un ensamblado dinmico usando el nombre, el modo de acceso, el


directorio de almacenamiento y la opcin de sincronizacin
especificados.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, Evidence,
PermissionSet, PermissionSet, PermissionSet)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso, la evidencia y las solicitudes de
permiso.

DefineDynamicAssembly(AssemblyName,

Obsoleto. Define un ensamblado dinmico utilizando el nombre

MCT: Luis Dueas

Pag 23 de 28

Programar con dominios de aplicacin y ensamblados

AssemblyBuilderAccess, String,
PermissionSet, PermissionSet, PermissionSet)

especificado, el modo de acceso, el directorio de almacenamiento y las


solicitudes de permiso.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso, el directorio de almacenamiento, la
evidencia y las solicitudes de permiso.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet,
Boolean)

Obsoleto. Define un ensamblado dinmico utilizando el nombre


especificado, el modo de acceso, el directorio de almacenamiento, la
evidencia, las solicitudes de permiso y la opcin de sincronizacin.

DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet,
Boolean,
IEnumerable<CustomAttributeBuilder>)

Obsoleto. Define un ensamblado dinmico con el nombre especificado,


el modo de acceso, el directorio de almacenamiento, la evidencia, las
solicitudes de permiso, la opcin de sincronizacin y los atributos
personalizados.

DoCallBack

Ejecuta el cdigo en otro dominio de aplicacin identificado por el


delegado especificado.

Equals(Object)

Determina si el objeto especificado es igual al objeto actual. (Se hereda


de Object).

ExecuteAssembly(String)

Ejecuta el ensamblado que contiene el archivo especificado.

ExecuteAssembly(String, Evidence)

Obsoleto. Ejecuta el ensamblado que contiene el archivo especificado,


utilizando la evidencia especificada.

ExecuteAssembly(String, String[])

Ejecuta el ensamblado contenido en el archivo especificado, usando los


argumentos especificados.

ExecuteAssembly(String, Evidence,String[])

Obsoleto. Ejecuta el ensamblado que contiene el archivo especificado,


utilizando la evidencia y los argumentos especificados.

ExecuteAssembly(String, String[], Byte[],


AssemblyHashAlgorithm)

Ejecuta el ensamblado contenido en el archivo especificado, usando los


argumentos, el valor hash y el algoritmo hash especificados.

ExecuteAssembly(String, Evidence,
String[], Byte[], AssemblyHashAlgorithm)

Obsoleto. Ejecuta el ensamblado contenido en el archivo especificado,


usando la evidencia, los argumentos, el valor hash y el algoritmo hash
especificados.

ExecuteAssemblyByName(String)

Ejecuta un ensamblado a partir de su nombre para mostrar.

ExecuteAssemblyByName(AssemblyName,
String[])

Ejecuta el ensamblado a partir de un objeto AssemblyName, usando los


argumentos especificados.

ExecuteAssemblyByName(String, Evidence)

Obsoleto. Ejecuta un ensamblado a partir de su nombre para mostrar,


utilizando la evidencia especificada.

ExecuteAssemblyByName(String, String[])

Ejecuta el ensamblado a partir de su nombre para mostrar, usando los


argumentos especificados.

ExecuteAssemblyByName(AssemblyName,
Evidence, String[])

Obsoleto. Ejecuta el ensamblado a partir de un objeto AssemblyName,


utilizando la evidencia y los argumentos especificados.

ExecuteAssemblyByName(String,
Evidence, String[])

Obsoleto. Ejecuta el ensamblado a partir de su nombre para mostrar,


utilizando la evidencia y argumentos especificados.

GetAssemblies

Obtiene los ensamblados que se han cargado en el contexto de ejecucin


de este dominio de aplicacin.

MCT: Luis Dueas

Pag 24 de 28

Programar con dominios de aplicacin y ensamblados

GetCurrentThreadId

Obsoleto. Obtiene el identificador del subproceso actual.

GetData

Obtiene el valor almacenado en el dominio de aplicacin actual para el


nombre especificado.

GetHashCode

Sirve como la funcin hash predeterminada. (Se hereda de Object).

GetLifetimeService

Recupera el objeto de servicio de duracin actual que controla la directiva


de duracin de esta instancia. (Se hereda de MarshalByRefObject).

GetType

Obtiene el tipo de la instancia actual.


En XNA Framework 3.0, este miembro se hereda de Object.GetType().

InitializeLifetimeService

Concede al AppDomain una duracin infinita ya que impide que se


genere
una
concesin. (Invalida
a
MarshalByRefObject.
InitializeLifetimeService()).

IsCompatibilitySwitchSet

Obtiene un valor booleano que acepta valores NULL que indica si se ha


establecido algn modificador de compatibilidad y, en ese caso, si se ha
establecido el modificador de compatibilidad especificado.

IsDefaultAppDomain

Devuelve un valor que indica si el dominio de aplicacin es el dominio de


aplicacin predeterminado para el proceso.

IsFinalizingForUnload

Indica si se est descargando este dominio de aplicacin y si Common


Language Runtime est finalizando los objetos que contiene.

Load(AssemblyName)

Carga un Assembly a partir de su AssemblyName.

Load(Byte[])

Carga el Assembly con una imagen basada en el formato COFF


(Common Object File Format) que contiene un Assembly emitido.

Load(String)

Carga un Assembly a partir de su nombre de presentacin.

Load(AssemblyName, Evidence)

Obsoleto. Carga un Assembly a partir de su AssemblyName.

Load(Byte[], Byte[])

Carga el Assembly con una imagen basada en el formato COFF


(Common
Object
File
Format)
que
contiene
un
Assembly emitido. Tambin se cargan los bytes sin formato que
representan los smbolos del Assembly.

Load(String, Evidence)

Obsoleto. Carga un Assembly a partir de su nombre de presentacin.

Load(Byte[], Byte[], Evidence)

Obsoleto. Carga el Assembly con una imagen basada en el formato


COFF
(Common
Object
File
Format)
que
contiene
un Assembly emitido. Tambin se cargan los bytes sin formato que
representan los smbolos del Assembly.

ReflectionOnlyGetAssemblies

Devuelve los ensamblados que se han cargado en el contexto de slo


reflexin del dominio de aplicacin.

SetAppDomainPolicy

Obsoleto. Establece el nivel de directiva de seguridad para este dominio


de aplicacin.

SetCachePath

Obsoleto. Establece la ruta de acceso al directorio especificado como la


ubicacin donde se almacenan las copias sombra de los ensamblados.

SetData(String, Object)

Asigna el valor especificado a la propiedad especificada del dominio de


aplicacin.

SetData(String, Object, IPermission)

Asigna el valor especificado a la propiedad de dominio de aplicacin


indicada, con un permiso especificado que se exige al llamador cuando se

MCT: Luis Dueas

Pag 25 de 28

Programar con dominios de aplicacin y ensamblados

recupera la propiedad.
SetDynamicBase

Obsoleto. Establece la ruta de acceso al directorio especificado como


directorio base de los subdirectorios donde se almacenan los archivos
generados de forma dinmica y se obtiene acceso a ellos.

SetPrincipalPolicy

Especifica la forma en que los objetos principales y de identidad deben


asociarse a un subproceso si ste intenta enlazarse a un principal mientas
se ejecuta en este dominio de aplicacin.

SetShadowCopyFiles

Obsoleto. Activa las copias sombra.

SetShadowCopyPath

Obsoleto. Establece la ruta de acceso al directorio especificado como la


ubicacin de las copias sombra de los ensamblados.

SetThreadPrincipal

Establece el objeto principal predeterminado que se va a asociar a los


subprocesos si stos intentan enlazarse a un principal mientras se ejecutan
en este dominio de aplicacin.

ToString

Obtiene una representacin en forma de cadena que incluye el nombre


descriptivo del dominio de aplicacin y cualquier directiva del
contexto. (Invalida a Object.ToString()).

Unload

Descarga el dominio de aplicacin especificado.

Eventos
Nombre

Descripcin

AssemblyLoad

Se produce cuando se carga un ensamblado.

AssemblyResolve

Se produce cuando la resolucin de un ensamblado produce errores.

DomainUnload

Se produce cuando un AppDomain est a punto de descargarse.

FirstChanceException

Ocurre cuando se produce una excepcin en cdigo administrado, antes de que el


runtime busque un controlador de excepciones en la pila de llamadas del dominio de
aplicacin.

ProcessExit

Se produce al salir del proceso primario del dominio de aplicacin predeterminado.

ReflectionOnlyAssemblyResolve

Aparece cuando se produce un error en la resolucin de un ensamblado en el contexto


de slo reflexin.

ResourceResolve

Aparece cuando se produce un error en la resolucin de un recurso porque ste no es un


recurso vinculado vlido o incrustado en el ensamblado.

TypeResolve

Se produce cuando la resolucin de un tipo produce errores.

UnhandledException

Se produce cuando no se detecta una excepcin.

Implementaciones explcitas de interfaces


Nombre

Descripcin

_AppDomain.GetIDsOfNames

Asigna un conjunto de nombres a un conjunto correspondiente de identificadores de


envo.

_AppDomain.GetTypeInfo

Recupera la informacin de tipo de un objeto, que se puede utilizar despus para


obtener la informacin de tipo de una interfaz.

MCT: Luis Dueas

Pag 26 de 28

Programar con dominios de aplicacin y ensamblados

_AppDomain.GetTypeInfoCount

Recupera el nmero de interfaces de tipo de informacin que suministra un objeto (0


1)

_AppDomain.Invoke

Proporciona acceso a las propiedades y los mtodos expuestos por un objeto.

Comentarios
Los dominios de aplicacin, representados por los objetos AppDomain, ayudan a proporcionar aislamiento, descarga y lmites de
seguridad para ejecutar el cdigo administrado.
Utilice los dominios de aplicacin para aislar tareas que podran derrumbar un proceso. Si el estado del
objeto AppDomain que est ejecutando una tarea se vuelve inestable, el objeto AppDomain se puede descargar sin afectar al
proceso. Es importante cuando un proceso debe ejecutarse durante largos perodos sin reiniciar. Tambin puede utilizar los
dominios de aplicacin para aislar tareas que no deberan compartir datos.

Si se carga un ensamblado en el dominio de aplicacin predeterminado, no se podr descargar de la memoria mientras el


proceso se est ejecutando. Sin embargo, si se abre un segundo dominio de aplicacin para cargar y ejecutar el ensamblado,
ste se descarga cuando se descarga ese dominio de aplicacin. Utilice esta tcnica para minimizar el espacio de trabajo de
los procesos de ejecucin larga que en ocasiones utilizan grandes archivos DLL.
Varios dominios de aplicacin pueden ejecutarse en un nico proceso; sin embargo, no existe una correlacin uno a uno entre los
dominios de aplicacin y los subprocesos. Varios subprocesos pueden pertenecer a un solo dominio de aplicacin y, aunque un
subproceso determinado no est confinado en un nico dominio de aplicacin, en un momento dado, un subproceso se ejecuta en un
solo dominio de aplicacin.
Los dominios de aplicacin se crean utilizando el mtodo CreateDomain. Las instancias de AppDomain se utilizan para cargar y ejecutar
ensamblados (Assembly). Cuando un AppDomain deja de utilizarse, puede descargarse.
La clase AppDomain implementa un conjunto de eventos que permiten a las aplicaciones responder cuando se cargue un ensamblado,
se descargue un dominio de aplicacin o se produce una excepcin no controlada.
Esta clase implementa las interfaces MarshalByRefObject, _AppDomain y IEvidenceFactory.
No se debe crear nunca un contenedor utilizable en modo remoto para un objeto AppDomain. Si se hace, se puede publicar una
referencia remota a ese objetoAppDomain y dejar expuestos mtodos como CreateInstance para el acceso remoto, destruyendo as la
seguridad de acceso del cdigo de dicho objeto AppDomain. Al conectarse al objeto AppDomain remoto, los clientes malintencionados
podran obtener acceso a cualquier recurso al que tenga acceso el propio objeto AppDomain. No cree contenedores utilizables de
manera remota para ningn tipo que extienda MarshalByRefObject y que implemente mtodos que puedan utilizar los clientes
maliciosos para eludir el sistema de seguridad.

Precaucin
El valor predeterminado de la propiedad AppDomainSetup.DisallowCodeDownload es false. Esta configuracin no es segura
para los servicios. Para evitar que los servicios descarguen cdigo de confianza parcial, establezca esta propiedad en true.

Ejemplos
En este ejemplo se muestra cmo crear un nuevo objeto AppDomain, cmo crear instancias de un tipo en ese nuevo AppDomain y
cmo comunicarse con el objeto de ese tipo. Adems, en este ejemplo se muestra cmo descargar el objeto AppDomain que provoca
que el objeto se recolecte como elemento no utilizado.
using System;
using System.Reflection;
using System.Threading;
class Module1
{
public static void Main()
{
// Get and display the friendly name of the default AppDomain.
string callingDomainName = Thread.GetDomain().FriendlyName;
Console.WriteLine(callingDomainName);
// Get and display the full name of the EXE assembly.
string exeAssembly = Assembly.GetEntryAssembly().FullName;
Console.WriteLine(exeAssembly);
// Construct and initialize settings for a second AppDomain.
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationBase = System.Environment.CurrentDirectory;
ads.DisallowBindingRedirects = false;
ads.DisallowCodeDownload = true;
ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;

MCT: Luis Dueas

Pag 27 de 28

Programar con dominios de aplicacin y ensamblados

// Create the second AppDomain.


AppDomain ad2 = AppDomain.CreateDomain("AD #2", null, ads);
// Create an instance of MarshalbyRefType in the second AppDomain.
// A proxy to the object is returned.
MarshalByRefType mbrt = (MarshalByRefType) ad2.CreateInstanceAndUnwrap(
exeAssembly, typeof(MarshalByRefType).FullName);
// Call a method on the object via the proxy, passing the
// default AppDomain's friendly name in as a parameter.
mbrt.SomeMethod(callingDomainName);
// Unload the second AppDomain. This deletes its object and
// invalidates the proxy object.
AppDomain.Unload(ad2);
try
{
// Call the method again. Note that this time it fails
// because the second AppDomain was unloaded.
mbrt.SomeMethod(callingDomainName);
Console.WriteLine("Sucessful call.");
}
catch(AppDomainUnloadedException)
{
Console.WriteLine("Failed call; this is expected.");
}
}
}
// Because this class is derived from MarshalByRefObject, a proxy
// to a MarshalByRefType object can be returned across an AppDomain boundary.
public class MarshalByRefType : MarshalByRefObject
{
// Call this method via a proxy.
public void SomeMethod(string callingDomainName)
{
// Get this AppDomain's settings and display some of them.
AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation;
Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}",
ads.ApplicationName, ads.ApplicationBase, ads.ConfigurationFile);
// Display the name of the calling AppDomain and the name of the second domain.
// NOTE: The application's thread has transitioned between AppDomains.
Console.WriteLine("Calling from '{0}' to '{1}'.",
callingDomainName, Thread.GetDomain().FriendlyName
);
}
}
/* This code produces output similar to the following:
AppDomainX.exe
AppDomainX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
AppName=, AppBase=C:\AppDomain\bin, ConfigFile=C:\AppDomain\bin\AppDomainX.exe.config
Calling from 'AppDomainX.exe' to 'AD #2'.
Failed call; this is expected.
*/

MCT: Luis Dueas

Pag 28 de 28

Das könnte Ihnen auch gefallen