Beruflich Dokumente
Kultur Dokumente
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);
}
}
Ejemplo
MCT: Luis Dueas
Pag 1 de 28
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);
}
}
Pag 2 de 28
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.
Pag 3 de 28
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);
}
}
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");
Pag 4 de 28
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.
Pag 5 de 28
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.
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.
Pag 6 de 28
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:
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.
Pag 7 de 28
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);
}
}
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.
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.
Pag 8 de 28
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.
Pag 9 de 28
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.
Pag 10 de 28
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.
La herramienta Assembly Linker (Al.exe) se puede usar para crear un ensamblado a partir de una coleccin de mdulos de cdigo
compilados.
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.
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
Pag 11 de 28
Valor que establece atributos del ensamblado, por ejemplo si el ensamblado se puede ejecutar
de forma simultnea.
AssemblyVersionAttribute
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
AssemblyCopyrightAttribute
AssemblyFileVersionAttribute
AssemblyInformationalVersionAttribute
AssemblyProductAttribute
AssemblyTrademarkAttribute
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.
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.
Pag 12 de 28
Descripcin
AssemblyDelaySignAttribute
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)]
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.
Nota
Pag 13 de 28
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.
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")]
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
Pag 14 de 28
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.
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.
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:
Pag 15 de 28
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
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.
Pag 16 de 28
Nota
Gacutil.exe slo debe usarse para programacin y no para instalar ensamblados de produccin en la cach de
ensamblados global.
Para instalar un ensamblado con nombre seguro en la cach de ensamblados global utilizando
la herramienta Cach de ensamblados global (Gacutil.exe)
gacutil -i hello.dll
gacutil -u hello
Pag 17 de 28
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.
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
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:
Pag 18 de 28
Directiva
Descripcin
Especifica otro ensamblado que contiene elementos a los que hace referencia el mdulo
actual (en este ejemplo, mscorlib).
.corflags
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.
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.
Pag 19 de 28
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
ApplicationIdentity
ApplicationTrust
BaseDirectory
CurrentDomain
DomainManager
DynamicDirectory
Evidence
FriendlyName
Id
IsFullyTrusted
IsHomogenous
Pag 20 de 28
MonitoringIsEnabled
MonitoringSurvivedMemorySize
MonitoringSurvivedProcessMemorySize
Obtiene los bytes totales que sobrevivieron a la ltima recoleccin para todos
los dominios de aplicacin del proceso.
MonitoringTotalAllocatedMemorySize
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
RelativeSearchPath
SetupInformation
ShadowCopyFiles
Mtodos
Nombre
Descripcin
AppendPrivatePath
ApplyPolicy
ClearPrivatePath
ClearShadowCopyPath
CreateComInstanceFrom(String, String)
CreateComInstanceFrom(String, String,Byte[],
AssemblyHashAlgorithm)
CreateDomain(String)
CreateDomain(String, Evidence)
CreateDomain(String, Evidence,
AppDomainSetup)
Pag 21 de 28
CreateDomain(String, Evidence,
AppDomainSetup,
PermissionSet,StrongName[])
CreateInstance(String, String)
CreateInstanceAndUnwrap(String, String)
CreateInstanceAndUnwrap(String,
String,Object[])
CreateInstanceAndUnwrap(String, String,
Boolean, BindingFlags, Binder, Object[],
CultureInfo, Object[])
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)
CreateInstanceFrom(String, String,Object[])
Pag 22 de 28
CultureInfo, Object[])
CreateInstanceFrom(String, String, Boolean,
BindingFlags, Binder, Object[],
CultureInfo, Object[], Evidence)
CreateInstanceFromAndUnwrap(String,
String)
CreateInstanceFromAndUnwrap(String,
String, Object[])
CreateInstanceFromAndUnwrap(String, String,
Boolean, BindingFlags, Binder,Object[],
CultureInfo, Object[])
CreateInstanceFromAndUnwrap(String, String,
Boolean, BindingFlags, Binder,Object[],
CultureInfo, Object[], Evidence)
CreateObjRef
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess,
IEnumerable<CustomAttributeBuilder>)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, Evidence)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess,
IEnumerable<CustomAttributeBuilder>,
SecurityContextSource)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, PermissionSet,
PermissionSet, PermissionSet)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Boolean,
IEnumerable<CustomAttributeBuilder>)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, Evidence,
PermissionSet, PermissionSet, PermissionSet)
DefineDynamicAssembly(AssemblyName,
Pag 23 de 28
AssemblyBuilderAccess, String,
PermissionSet, PermissionSet, PermissionSet)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet,
Boolean)
DefineDynamicAssembly(AssemblyName,
AssemblyBuilderAccess, String, Evidence,
PermissionSet, PermissionSet, PermissionSet,
Boolean,
IEnumerable<CustomAttributeBuilder>)
DoCallBack
Equals(Object)
ExecuteAssembly(String)
ExecuteAssembly(String, Evidence)
ExecuteAssembly(String, String[])
ExecuteAssembly(String, Evidence,String[])
ExecuteAssembly(String, Evidence,
String[], Byte[], AssemblyHashAlgorithm)
ExecuteAssemblyByName(String)
ExecuteAssemblyByName(AssemblyName,
String[])
ExecuteAssemblyByName(String, Evidence)
ExecuteAssemblyByName(String, String[])
ExecuteAssemblyByName(AssemblyName,
Evidence, String[])
ExecuteAssemblyByName(String,
Evidence, String[])
GetAssemblies
Pag 24 de 28
GetCurrentThreadId
GetData
GetHashCode
GetLifetimeService
GetType
InitializeLifetimeService
IsCompatibilitySwitchSet
IsDefaultAppDomain
IsFinalizingForUnload
Load(AssemblyName)
Load(Byte[])
Load(String)
Load(AssemblyName, Evidence)
Load(Byte[], Byte[])
Load(String, Evidence)
ReflectionOnlyGetAssemblies
SetAppDomainPolicy
SetCachePath
SetData(String, Object)
Pag 25 de 28
recupera la propiedad.
SetDynamicBase
SetPrincipalPolicy
SetShadowCopyFiles
SetShadowCopyPath
SetThreadPrincipal
ToString
Unload
Eventos
Nombre
Descripcin
AssemblyLoad
AssemblyResolve
DomainUnload
FirstChanceException
ProcessExit
ReflectionOnlyAssemblyResolve
ResourceResolve
TypeResolve
UnhandledException
Descripcin
_AppDomain.GetIDsOfNames
_AppDomain.GetTypeInfo
Pag 26 de 28
_AppDomain.GetTypeInfoCount
_AppDomain.Invoke
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.
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;
Pag 27 de 28
Pag 28 de 28