6.CLR AppDomain Reflection

download 6.CLR AppDomain Reflection

of 24

Transcript of 6.CLR AppDomain Reflection

  • 8/10/2019 6.CLR AppDomain Reflection

    1/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 1

    Creare CLR, AppDomain, si Reflection

    Metadata: una din cele mai importante trasaturi ale .NET-ului

    Metadata descrie tipul unui camp precum si metodele asociate acestuia.

    Metadata:

    contine informatia de care un tip de data are nevoie pentru a se defini;

    este folosita de GC pentru a determina daca un obiect mai este valid in heap;

    este folosita de utilitarele de dezvoltare pentru a construi help senzitiv utilizat in

    momentul scrierii codului (vezi Intellisense);

    este folosita in procesul de serializare si deserializare al obiectelor.

    Actiunea de examinare a metadatei se numeste reflection.

    Reflection permite dezvoltatorilor de a construi in mod dinamic aplicatii extensibile.

    De exemplu, oricine poate scrie un tip de data si sa-l impacheteze intr-un assembly.

    Cand altcineva foloseste acest tip, datorita informatiilor din metadata, un mediu de

    dezvoltare (Visual Studio .NET, etc.) poate integra acest tip in cadrul proiectului si sa

    afiseze proprietatile expuse de acest tip.

    CLR modalitati de instantiere

    Cadrul de lucru .NET ruleaza deasupra sistemului de operare. Acest lucru inseamna ca

    .NET trebuie sa foloseasca tehnologii pe care Windows sa le inteleaga.

    CLR a fost implementat ca un server COM continut intr-un DLL ; deci acesta are o

    interfata COM standard, are atribuit un GUID. Toate aceste informatii sunt scrise in

    registri in momentul instalarii serverului COM.

    Definitiile pentru acest server se gasesc in MSCorEE.h (definitia interfetei

    ICorRuntimeHostsi definitiile GUID-urilor).

    Pentru a crea o instanta a acestui server va trebui sa utilizam functia CorBindToRuntimeEx

    in loc de functia CoCreateInstance.

    Functia CorBindToRuntimeEx este implementata in MSCorEE.dll ce se gaseste in

    subdirectorul System32al sistemului de operare, dar serverul nu este in acest DLL.

    Aceasta biblioteca este folosita pentru a determina versiunea corecta a CLR-ului ce se va

    crea. Biblioteca MScorWks.dllcontine versiunea pentru statii de lucru, iar MSCorSvr.dll

    contine versiunea pentru server.

    O aplicatie poate suprascrie valorile implicite necesare pentru crearea serverului plasand

    informatii intr-un fisier de configurare XML, ca in exemplul urmator :

    Daca safemode = false, atunci se incarca versiunea de CLR cea mai recenta ce este

    compatibila cu versiunea aplicatiei noastre.

  • 8/10/2019 6.CLR AppDomain Reflection

    2/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 2

    MS determina ce versiune de CLR este compatibila cu alte versiuni prin crearea de

    informatii in registri. Aceste se gasesc sub cheia

    HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\Policy

    Functia CorBindToRuntimeEx returneaza un pointer la interfata unmanaged

    ICorRuntimeHost (definita in MSCorEE.h). Aplicatia poate apela metodele definte deaceasta interfata pentru a initializa CLR.

    Un singur proces poate crea numai o instanta a unui server COM CLR.

    Dintre multele actiuni efectuate in timpul initializarii CLR, enumeram:

    Se creaza zona heap managed in care vor fi alocate obiectele referinta si pe care o

    va gestiona GC.

    Se creaza un thread pool folosit de orice tip managed ale carui assembly sunt

    incarcati in proces.

    Se creaza un AppDomain. Un AppDomain poate fi asimilat ca un container logic

    pentru o multime de assemblies.Primul AppDomain creat se numeste AppDomain

    implicit. Acest AppDomain implicit este distrus cand procesul Windows se

    termina. CLR poate crea mai multe AppDomain, in afara de cel implicit.

    AppDomain

    Sunt reprezentate de obiecteAppDomain.

    Un proces poate contine mai multeAppDomain, iar unAppDomainpoate contine unul sau

    mai multe fire.

    AppDomain sunt create cu metoda CreateDomain.

    Instantele AppDomain sunt folosite pentru a incarca si executa assemblies.

    Clasa AppDomainimplementeaza o multime de evenimente ce permite aplicatiilor saraspunda cand un assembly este incarcat, cand un AppDomain este descarcat sau cand este

    lansata o exceptie necunoscuta.

    Aceasta clasa implementeaza MarshalByRefObject, si interfetele _AppDomain si

    IEvidenceFactory.

    Interfata_AppDomain implementeaza o multime de evenimente ce permit aplicatiilor sa

    raspunda cand un assembly este incarcat, unAppDomain va fi descarcatsau sa trateze

    exceptii.

    MarshalByRefObjecteste clasa de baza pentru obiectele ce comunica in afara

    frontierelor aplicatiei prin schimbul de mesage folosind un proxy.Obiectele ce nu sunt mostenite dinMarshalByRefObjectsunt implicit transferate

    prin valoare.

    Obiectele MarshalByRefObjectsunt accesate direct in interiorul domeniului.Pentru a realiza acest lucru se foloseste un proxy, ce este pasat aplicatiei remote.

    Toate apelurile se realizeaza prin cadrul acestui proxy (tehnica asemanatoare si la

    COM/DCOM).

  • 8/10/2019 6.CLR AppDomain Reflection

    3/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 3

    Public Properties

    BaseDirectory Gets the base directory that the assembly resolver used toprobe for assemblies.

    CurrentDomain Gets the current application domain for the current Thread.

    DynamicDirectory Gets the directory that the assembly resolver used to probefor dynamically-created assemblies.

    Evidence Gets the Evidenceassociated with this application domainthat is used as input to the security policy.

    FriendlyName

    Supported by the .NET

    Compact Framework.

    Gets the friendly name of this application domain.

    RelativeSearchPath Gets the path relative to the base directory where theassembly resolver should probe for private assemblies.

    SetupInformation Gets the application domain configuration information for

    this instance.ShadowCopyFiles Gets an indication whether all assemblies loaded in the

    application domain are shadow copied.

    Public Methods

    AppendPrivatePath Appends the specified name of the directory to theprivate path.

    ClearPrivatePath Resets the path that specifies the location of privateassemblies to the empty string ("").

    ClearShadowCopyPath Resets the list of directories containing shadow copiedassemblies to the empty string ("").

    CreateComInstanceFrom Overloaded.

    CreateDomain

    Supported by the .NET

    Compact Framework.

    Overloaded. Creates a new application domain.

    CreateInstance Overloaded. Creates a new instance of a specifiedtype defined in a specified assembly.

    CreateInstanceAndUnwrap Overloaded. Creates a new instance of a specifiedtype.

    CreateInstanceFrom Overloaded. Creates a new instance of a specified

    type defined in the specified assembly file.

    CreateInstanceFromAndUnwrap

    Overloaded. Creates a new instance of a specified

    type defined in the specified assembly file.

    CreateObjRef(inherited from

    MarshalByRefObject)

    Creates an object that contains all the relevantinformation required to generate a proxy used tocommunicate with a remote object.

    DefineDynamicAssembly Overloaded. Defines a dynamic assembly in thecurrent application domain.

    DoCallBack Executes the code in another application domain that

    is identified by the specified delegate.

    Equals(inherited from Overloaded. Determines whether two Object

  • 8/10/2019 6.CLR AppDomain Reflection

    4/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 4

    Object)

    Supported by the .NET

    Compact Framework.

    instances are equal.

    ExecuteAssembly

    Supported by the .NET

    Compact Framework.

    Overloaded. Executes the assembly contained in the

    specified file.

    GetAssemblies Gets the assemblies that have been loaded into thisapplication domain.

    GetCurrentThreadId Gets the current thread identifier.

    GetData Gets the value stored in the current application

    domain for the specified data name.

    GetHashCode(inherited fromObject)

    Supported by the .NET

    Compact Framework.

    Serves as a hash function for a particular type,suitable for use in hashing algorithms and datastructures like a hash table.

    GetLifetimeService(inherited

    from MarshalByRefObject)

    Retrieves the current lifetime service object that

    controls the lifetime policy for this instance.

    GetType(inherited fromObject)

    Supported by the .NET

    Compact Framework.

    Gets the Typeof the current instance.

    InitializeLifetimeService Overridden. Gives the AppDomainan infinite lifetimeby preventing a lease from being created.

    IsFinalizingForUnload Indicates whether this application domain isunloading, and the objects it contains are beingfinalized by the common language runtime.

    Load Overloaded. Loads an Assemblyinto this applicationdomain.

    SetAppDomainPolicy Establishes the security policy level for thisapplication domain.

    SetCachePath Establishes the specified directory path as the locationwhere assemblies are shadow copied.

    SetData Assigns the specified value to the specified applicationdomain property.

    SetDynamicBase Establishes the specified directory path as the locationwhere dynamically generated files are stored and

    accessed.

    SetPrincipalPolicy Specifies how principal and identity objects should beattached to a thread if the thread attempts to bind toa principal while executing in this application domain.

    SetShadowCopyFiles Turns on shadow copying.

    SetShadowCopyPath Establishes the specified directory path as the location

  • 8/10/2019 6.CLR AppDomain Reflection

    5/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 5

    of assemblies to be shadow copied.

    SetThreadPrincipal Sets the default principal object to be attached tothreads if they attempt to bind to a principal whileexecuting in this application domain.

    ToString

    Supported by the .NETCompact Framework.

    Overridden. Obtains the Stringrepresentation of thisinstance.

    Unload Unloads the specified application domain.

    Public Events

    AssemblyLoad Occurs when an assembly is loaded.

    AssemblyResolve Occurs when the resolution of an assembly fails.

    DomainUnload Occurs when an AppDomainis about to be unloaded.

    ProcessExit Occurs on the default application domain when the defaultapplication domain's parent process exits.

    ResourceResolve Occurs when the resolution of a resource fails.

    TypeResolve Occurs when the resolution of a type fails.

    UnhandledException Occurs when an exception is not caught by an eventhandler.

    Protected Methods

    Finalize(inherited fromObject)

    Supported by the .NET Compact

    Framework.

    Overridden. Allows an Objectto attempt to freeresources and perform other cleanup operationsbefore the Objectis reclaimed by garbage collection.

    In C# and C++, finalizers are expressed using

    destructor syntax.

    MemberwiseClone(inheritedfrom Object)

    Supported by the .NET Compact

    Framework.

    Creates a shallow copy of the current Object.

    Exemplu pentru tratarea unui eveniment.

    AppDomain.AssemblyLoad Event[C#]

    public virtual event AssemblyLoadEventHandlerAssemblyLoad;

    Event Data

    Functia ce trateaza evenimentul primeste un argument de tip AssemblyLoadEventArgsce contine informatii despre acest eveniment.Proprietatea AssemblyLoadEventArgsfurnizeaza informatii specifice pentru acest

    eveniment.

    Property Description

  • 8/10/2019 6.CLR AppDomain Reflection

    6/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 6

    LoadedAssembly Gets an Assemblythat represents thecurrently loaded assembly.

    Remarks

    The AssemblyLoadEventHandlerdelegate for this event indicates what assembly wasloaded.To register an event handler for this event, you must have the permissions described

    in the Permissions section. If you do not have the appropriate permissions, aSecurityException occurs.For more information about handling events, see Consuming Events.

    Example[Visual Basic, C#, C++] For this code example to run, you must provide the fullyqualified assembly name.

    [C#]

    using System;

    using System.Reflection;

    class Test {

    public static void Main()

    {

    AppDomain currentDomain = AppDomain.CurrentDomain;

    currentDomain.AssemblyLoad += newAssemblyLoadEventHandler(MyAssemblyLoadEventHandler);

    PrintLoadedAssemblies(currentDomain);

    // Lists mscorlib and this assembly

    // You must supply a valid fully qualified assembly name here.

    currentDomain.CreateInstance("System.Windows.Forms, Version,

    Culture, PublicKeyToken", "System.Windows.Forms.TextBox");

    // Loads System, System.Drawing, System.Windows.Forms

    PrintLoadedAssemblies(currentDomain);

    // Lists all five assemblies

    }

    static void PrintLoadedAssemblies(AppDomain domain)

    {

    Console.WriteLine("LOADED ASSEMBLIES:");

    foreach (Assembly a in domain.GetAssemblies())

    {

    Console.WriteLine(a.FullName);

    }

    Console.WriteLine();

    }

    static void MyAssemblyLoadEventHandler(object sender,AssemblyLoadEventArgs args)

    {Console.WriteLine("ASSEMBLY LOADED: " +args.LoadedAssembly.FullName);

    Console.WriteLine();}

    }

  • 8/10/2019 6.CLR AppDomain Reflection

    7/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 7

    AppDomain.CreateInstanceAndUnwrap Method

    Creates a new instance of a specified type.

    Overload ListCreates a new instance of the specified type. Parameters specify the assembly wherethe type is defined, and the name of the type.

    [C#] public object CreateInstanceAndUnwrap(string, string);

    Creates a new instance of the specified type. Parameters specify the assembly wherethe type is defined, the name of the type, and an array of activation attributes.

    [C#] public object CreateInstanceAndUnwrap(string, string, object[]);

    Creates a new instance of the specified type. Parameters specify the name of the

    type, and how it is found and created.

    [C#] public object CreateInstanceAndUnwrap(string, string, bool, BindingFlags,Binder, object[], CultureInfo, object[], Evidence);

    [C#]

    public objectCreateInstanceAndUnwrap(stringassemblyName,stringtypeName,boolignoreCase,BindingFlagsbindingAttr,Binderbinder,object[] args,CultureInfoculture,object[] activationAttributes,EvidencesecurityAttributes

    );

    ParametriassemblyName= nume assembly.typeName= numele tipului cerut (calificat complet).ignoreCase= valoare booleana; specifica daca se executa cautare case-sensitive saunu.

    bindingAttr= o combinatie de flaguri ce afecteaza cautarea constructorului pentrutypeName.binder= un obiect ce permite legarea, verificarea tipurilor argumentelor, invocareamembrilor si regasirea obiectelor MemberInfofolosind reflection. Daca binder este

    null, atunci se foloseste legarea implicita.args = argumentele ce trebuiesc pasate constructorului. Daca se doreste apelarea

    constructorului implicit, args trebuie sa fie null.culture= obiect folosit in verificarea tipurilor.

    activationAttributes= un tablou de atribute ce pot participa in procesul de invocare.securityAttributes= atribute de securitate pentru typeName.

    Valoarea returnata reprezinta o instanta a obiectului specificat de typeName.

    Exceptions

    Exception Type Condition

    ArgumentNullException assemblyNameor typeNameis a null

  • 8/10/2019 6.CLR AppDomain Reflection

    8/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 8

    reference (Nothingin Visual Basic).

    MissingMethodException No matching constructor was found.

    TypeLoadException typenamewas not found inassemblyName.

    FileNotFoundException assemblyNamewas not found.

    MethodAccessException The caller does not have permission to call

    this constructor.NotSupportedException The caller cannot provide activation

    attributes for an object that does notinherit from MarshalByRefObject.

    SecurityException The caller does not have the correctpermissions. See the requirementssection.

    AppDomainUnloadedException Operations are attempted on an unloadedapplication domain.

    Aceasta metoad combina CreateInstancesi ObjectHandle.Unwrapsi apeleaza

    constructorul implicit pentru typeName.

    Exemplu

    [C#]

    using System;

    using System.Reflection;

    class Test {

    static void Main() {

    InstantiateINT32(false); // Failed!

    InstantiateINT32(true); // OK!

    }

    static void InstantiateINT32(bool ignoreCase) {try {

    AppDomain currentDomain = AppDomain.CurrentDomain;

    object instance = currentDomain.CreateInstanceAndUnwrap(

    "mscorlib",

    "SYSTEM.INT32",

    ignoreCase,

    BindingFlags.Default,

    null,

    null,

    null,

    null,

    null

    );

    Console.WriteLine(instance.GetType());} catch (TypeLoadException e) {

    Console.WriteLine(e.Message);

    }

    }

    }

    Exemplu pentru CreateDomain (vezi MS). Importante sunt etapele de creare, care

    urmaresc prototipul metodei CreateDomaince va fi folosita.

  • 8/10/2019 6.CLR AppDomain Reflection

    9/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 9

    // Set up the AppDomainSetup

    AppDomainSetup setup = new AppDomainSetup();

    setup.ApplicationBase = "(some directory)";

    setup.ConfigurationFile = "(some file)";

    // Set up the Evidence

    Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;Evidence evidence = new Evidence(baseEvidence);

    evidence.AddAssembly("(some assembly)");

    evidence.AddHost("(some host)");

    // Create the AppDomain

    AppDomain newDomain = AppDomain.CreateDomain("newDomain", evidence,

    setup);

    Clasa AppDomainSetup = Contine informatii pentru legare assembly ce pot fiadaugate la o instanta a unui AppDomain.

    Membrii acestei clase sunt utilizati cu metodele AppDomain.GetDatasiAppDomain.SetDatapentru a identifica data System.AppDomaince trebuie utilizata.

    AppDomainSetup MembersAppDomainSetup overview

    Public Constructors

    AppDomainSetup Constructor Initializes a new instance of theAppDomainSetupclass.

    Public Properties

    ApplicationBase Gets or sets the name of the directory containingthe application.

    ApplicationName Gets or sets the name of the application.

    CachePath Gets or sets the name of an area specific to the

    application where files are shadow copied.

    ConfigurationFile Gets or sets the name of the configuration file foran application domain.

    DisallowBindingRedirects Gets or sets a value indicating if an applicationdomain allows assembly binding redirection.

    DisallowCodeDownload Gets or sets a value indicating whether HTTPdownload of assemblies is allowed for an

    application domain.

    DisallowPublisherPolicy Gets or sets a value indicating whether thepublisher policy section of the configuration file isapplied to an application domain.

    DynamicBase Gets or sets the directory where dynamically

    generated files are stored and accessed.LicenseFile Gets or sets the location of the license file

    associated with this domain.

    LoaderOptimization Specifies the optimization policy used to load anexecutable.

    PrivateBinPath Gets or sets the list of directories that is combined

    with the ApplicationBasedirectory to probe forprivate assemblies.

    PrivateBinPathProbe Gets or sets the private binary directory path used

  • 8/10/2019 6.CLR AppDomain Reflection

    10/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 10

    to locate an application.

    ShadowCopyDirectories Gets or sets the names of the directories containingassemblies to be shadow copied.

    ShadowCopyFiles Gets or sets a string that indicates whether shadowcopying is turned on or off.

    Clasa Evidence

    Defineste multimea de informatii ce constituie intrare pentru deciziile politicii desecuritate. Clasa nu poate fi mostenita.

    Obiectele de orice tip ce sunt recunoscute de politica de securitate reprezintaevidence.

    Politica de securitate este compusa din grupuri de cod; un assembly particular(unitatea de baza pentru acordarea drepturilor de securitate) este un membru al unuicod de grup daca satisface conditiile membrilor grupului de cod. Evidence este multimea intrarilor pentru aceasta politica de securitate folosita

    pentru a determina carui grup de cod ii apartine un anumit assembly.

    Clasa Evidence este o colectie (vezi ICollection) ce pastreaza multimea obiectelor cereprezinta evidence.Aceasta clasa tine doua multimi ce corespund sursei evidence : host evidence si

    assembly evidence.

    Cand se evalueaza permisiunile unui cod se folosesc aceste doua multimi. Host evidenceis provided by the host, and can only be provided by hosts

    that have been granted the ControlEvidence permission. Typically, this is evidenceof the origin of the code and digital signatures on the assembly. Evidence aboutorigin typically includes Url, Site, and Zone evidence. Signatures refer to software

    publisher (AuthentiCode X.509v3 signature) and strong name identities. Bothkinds of digital signature-based identity are built into the assembly, but must bevalidated and passed to policy by the host; when loaded, the security system

    verifies the signature. The system then creates the appropriate evidence andpasses it to policy only if the corresponding signature is valid. Assembly evidenceis part of the assembly itself. Developers or

    administrators can attach custom evidence to the assembly to extend the set of

    evidence for policy. Assembly evidence can only be added at the time of assemblygeneration, which occurs before the assembly is signed. The default policy of thesecurity system ignores assembly-provided evidence, but policy can be extendedto accept it.

    Public Constructors

    Evidence Constructor

    Supported by the .NET Compact

    Framework.

    Overloaded. Initializes a new instance of

    the Evidenceclass.

    Public Properties

    Count Gets the number of evidence objects in the evidence set.

    IsReadOnly Gets a value indicating whether the evidence set is read-only.

    IsSynchronized Gets a value indicating whether the evidence set is thread-

    safe.

    Locked Gets or sets a value indicating whether the evidence is

  • 8/10/2019 6.CLR AppDomain Reflection

    11/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 11

    locked.

    SyncRoot Gets the synchronization root.

    Public Methods

    AddAssembly Adds the specified assembly evidence to the

    evidence set.

    AddHost Adds the specified evidence supplied by the hostto the evidence set.

    CopyTo Copies evidence objects to an Array.

    Equals(inherited from Object)

    Supported by the .NET Compact

    Framework.

    Overloaded. Determines whether two Objectinstances are equal.

    GetAssemblyEnumerator Enumerates evidence provided by the assembly.

    GetEnumerator Enumerates all evidence in the set, both thatprovided by the host and that provided by theassembly.

    GetHashCode(inherited from

    Object)

    Supported by the .NET Compact

    Framework.

    Serves as a hash function for a particular type,suitable for use in hashing algorithms and data

    structures like a hash table.

    GetHostEnumerator Enumerates evidence supplied by the host.

    GetType(inherited from Object)

    Supported by the .NET Compact

    Framework.

    Gets the Typeof the current instance.

    Merge Merges the specified evidence set into the current

    evidence set.

    ToString(inherited from Object)

    Supported by the .NET Compact

    Framework.

    Returns a Stringthat represents the currentObject.

    Protected Methods

    Finalize(inherited from Object)Supported by the .NET Compact

    Framework.

    Overridden. Allows an Objectto attempt tofree resources and perform other cleanup

    operations before the Objectis reclaimedby garbage collection.In C# and C++, finalizers are expressedusing destructor syntax.

    MemberwiseClone(inherited fromObject)Supported by the .NET CompactFramework.

    Creates a shallow copy of the currentObject.

  • 8/10/2019 6.CLR AppDomain Reflection

    12/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 12

    AppDomain se caracterizeaza prin:

    Sunt izolate unele de altele un AppDomain nu poate vedeaobiectele create de alt

    AppDomain darpoate comunicacu tipuri si obiecte din alte AppDomain. Aceasta

    caracteristica face ca AppDomain sa poata fi descarcate din proces. CLR nu are

    posibilitatea de a descarca un singur assembly. Assemblies vor fi descrcati odata cu

    AppDomain care le-a incarcat.

    Pot fi configurate si securizate individual. Astfel se determina drepturile maximeatribuite unui assembly ce ruleaza intr-un AppDomain. Putem gestiona securitatea

    unui AppDomain folosind metoda SetAppDomainPolicy.

    Clasa System.AppDomainSetup ne permite sa definim si sa interogam setarile unui

    AppDomain. Aceste setari includ urmatoarele :

    ApplicationName un string folosit pentru a identifica un AppDomain.

    ApplicationBase un director unde CLR va cauta assemblies.

    PrivateBinPath o multime de directoare unde CLR va cauta sa localizeze assmblies cu

    nume slabe .

    ConfigurationFile numele caii unui fisier de configurare ce contine reguli pe care CLR

    le va utiliza pentru a localiza assemblies. Fisierul contine de asemenea setari pentru

    remoting, aplicatii Web, etc.LoaderOptimization un flag ce indica modul cum CLR trateaza assemblies incarcati :

    ca domain neutral sau single-domain .

    Observatie: S-ar putea sa fie periculos sa se ruleze mai multe aplicatii unmanaged intr-

    un singur proces, pentru ca acestea pot avea acces la datele si codul din cadrul celeilalte

    aplicatii.

    Accesarea obiectelor in afara unui AppDomain

    Codul dintr-un domeniu poate comunica cu tipuri si obiecte continute in alte domenii.

    Majoritatea tipurilor sunt transferate prin valoare in cadrul altor domenii. Obiectul este

    serializat in cadrul unui bloc de memorie si apoi transmis altui domeniu. Domeniul ce

    primeste acest obiect il va deserializa. Domeniul destinatie nu are acces la obiectul

    original.

    Obiectele transmise prin valoare trebuie sa aiba atributulSystem.Serializable.

    Deserializarea obiectului are ca efect incarcarea de catre CLR a tipului de assembly

    necesar. Daca CLR nu poate incarca acel assembly, atunci deserializarea nu are loc si va fi

    emisa o exceptie.

    Tipurile ce sunt derivate din System.MarshalByRefObjectpot fi de asemenea transmise

    altor domenii. In acest caz se transmite o referinta la obiect. Obiectul original ramine in

    domeniul sursa (acolo unde a fost creat obiectul).

    Nu exista o corespondenta de 1-1 intre fire si AppDomain. Cand se executa un fir dintr-un

    doemniu in alt domeniu, firul tranziteaza intre cele doua AppDomain, deci acesta esteexecutat in mod sincron. La un moment dat, un fir este considerat sa fie exact intr-un

    domeniu.

    Putem apela metoda statica GetDomaindin System.Threading.Threadpentru a obtine o

    referinta la un obiectSystem.AppDomainsi a identifica domeniul unde se executa firul.

    Cand un AppDomain este descarcat, toate firele din acest domeniu vor fi terminate, CLR-

    ul fortand o exceptie de tipul ThreadAbortException, de asemenea vor fi descarcate si

    assemblies continuti in AppDomain.

  • 8/10/2019 6.CLR AppDomain Reflection

    13/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 13

    Evenimente AppDomain

    Evenimentele pe care le putem trata sunt:

    AssemblyLoad apare cand CLR incarca un assembly intr-un domeniu. Functia ce trateaza

    evenimentul primeste un obiect System.Reflection.Assembly ce identifica assembly

    incarcat.DomainUnload - apare inainte ca AppDomain sa fie descarcat. Evenimentul nu apare

    cand procesul ce contine AppDomain este terminat.

    ProcessExit - apare inainte ca procesul sa se termine. Evenimentul este lansat numai

    pentru AppDomain implicit.

    UnhandledException - emis cand apare o exceptie intr-un AppDomain.

    AssemblyResolve apare cand CLR nu poate localiza un assembly cerut de un domeniu.

    Functia ce trateaza evenimentul primeste un string ce identifica numele assembly lipsa.

    ResourceResolve acelasi lucru ca la AssemblyResolve, numai ca este vorba de o resursa.

    TypeResolve Acelasi lucru ca mai sus, numai ca este vorba de un tip de data.

    Din nou despre Reflection

    Metadata este constituita dintr-o multime de tabele. Cand construim un assembly sau un

    modul, compilatorul creaza o serie de tabele: tabela de definitie a tipurilor, tabela de

    definitie a campurilor, tabela de definitie a metodelor, etc.

    Spatiul de nume System.Reflection din FCL contine mai multe tipuri ce permit sa scriem

    cod ce obtine informatii din aceste tabele. Tipurile din acest spatiu de nume ofera un

    model obiect peste metadata continuta in assembly sau modul.

    Cu ajutorul acestor tipuri putem enumera toate tipurile dintr-o tabela de definitie a

    tipurilor. Pentru fiiecare tip putem obtine tipul de baza, ce interfete implementeaza.

    De asemenea putem obtine campurile, metodele, proprietatile, atributele si evenimentele

    unui tip.

    Metoda reflection este cel mai des folosita cu clasele de biblioteci pentru a construi

    ierarhia corecta a definitiei tipurilor.

    Aceasta metoda poate fi folosita pentru a incarca un assembly in mod explict, apoi sa

    construiasca un obiect de un anumit tip (tip gazduit de acest assembly) si apoi sa apeleze

    metodele pe acest obiect (ceva asemanator cu LoadLibrary si GetProcAddress din Win32

    API) se realizeaza legarea intarziata .

    Obtinerea tipurilor unui assembly (reflection method)

    Exemplu

    using System;

    using System.Reflection;

    class App{

    static void Main()

    {

    Assembly assem = Assembly.GetExecutingAssembly();

    Reflector.ReflectOnAssembly(assem);

    }

    }

    public class Reflector

    {

  • 8/10/2019 6.CLR AppDomain Reflection

    14/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 14

    public static void ReflectOnAssembly(Assembly assem)

    {

    WriteLine(0, "Assembly: {0}", assem);

    // Find Modules

    foreach (Module m in assem.GetModules())

    {

    WriteLine(1, "Module: {0}", m);

    // Find Types

    foreach (Type t in m.GetTypes())

    {

    WriteLine(2, "Type: {0}", t);

    // Find Members

    foreach (MemberInfo mi in t.GetMembers())

    WriteLine(3, "{0}: {1}", mi.MemberType, mi);

    }

    }

    }

    private static void WriteLine(Int32 indent, String format,

    params Object[] args)

    {

    Console.WriteLine(new String( , 3 * indent) + format, args);

    }

    }class SomeType

    {

    public class InnerType {}

    public Int32 SomeField = 0;

    private static String goo = null;

    private void SomeMethod() { }

    private TimeSpan SomeProperty

    {

    get { return new TimeSpan(); }

    set { }

    }

    public static event System.Threading.ThreadStart SomeEvent;

    private void NoCompilerWarnings(){

    // This code is here just to make the compiler warnings go

    away.

    SomeEvent.ToString();

    goo.ToString();

    }

    }

    Rezultatul este:

    Assembly: p7_reflection, Version=1.0.1783.28359, Culture=neutral, PublicKeyToken

    =null

    Module: p7_reflection.exe

    Type: AppMethod: Int32 GetHashCode()

    Method: Boolean Equals(System.Object)

    Method: System.String ToString()

    Method: System.Type GetType()

    Constructor: Void .ctor()

    Type: Reflector

    Method: Int32 GetHashCode()

    Method: Boolean Equals(System.Object)

  • 8/10/2019 6.CLR AppDomain Reflection

    15/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 15

    Method: System.String ToString()

    Method: Void ReflectOnAssembly(System.Reflection.Assembly)

    Method: System.Type GetType()

    Constructor: Void .ctor()

    Type: SomeType

    Field: Int32 SomeField

    Method: Int32 GetHashCode()Method: Boolean Equals(System.Object)

    Method: System.String ToString()

    Method: Void add_SomeEvent(System.Threading.ThreadStart)

    Method: Void remove_SomeEvent(System.Threading.ThreadStart)

    Method: System.Type GetType()

    Constructor: Void .ctor()

    Event: System.Threading.ThreadStart SomeEvent

    NestedType: SomeType+InnerType

    Type: SomeType+InnerType

    Method: Int32 GetHashCode()

    Method: Boolean Equals(System.Object)

    Method: System.String ToString()Method: System.Type GetType()

    Constructor: Void .ctor()

    Press any key to continue . . .

    GetExecutingAssembly= determina ce assembly contine metoda ce face apel si returneaza

    o refrinta la acest obiect Assembly.

    ReflectOnAssembly = afiseaza numele complet al unui assembly si apoi apeleaza

    GetModulesce returneaza un vector cu elemente de tipSystem.Reflection.Module.

    Vezi si GetTypes si GetMembers.

    Obtinere assembly dintr-un AppDomain

    Acelasi exemplu ca mai sus in care modificam Main dupa cum urmeaza:

    static void Main()

    {

    foreach (Assembly assem in

    AppDomain.CurrentDomain.GetAssemblies())

    {

    Reflector.ReflectOnAssembly(assem);

    }

    }

    Incarcarea explicita a unui assembly

    Tehnica este asemanatoare cu cea a utilizarii functieiLoadLibrarydin Win32 API.

    Tipul System.Reflection.Assembly ofera urmatoarele metode statice pentru a incarca un

    assembly: Load, LoadFrom, siLoadWithPartialName.

    Load (documentatie MS)

    Loads an assembly given its AssemblyName.

  • 8/10/2019 6.CLR AppDomain Reflection

    16/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 16

    [C#] public static Assembly Load(AssemblyName);

    Loads the assembly with a Common Object File Format (COFF)-based imagecontaining an emitted assembly. The assembly is loaded into the domain of the caller.[C#] public static Assembly Load(byte[]);

    Loads an assembly given the long form of its name.

    [C#] public static Assembly Load(string);

    Loads an assembly given its AssemblyName. The assembly is loaded into the domain

    of the caller using the supplied evidence.[C#] public static Assembly Load(AssemblyName, Evidence);Loads the assembly with a Common Object File Format (COFF)-based image

    containing an emitted assembly.

    [C#] public static Assembly Load(byte[], byte[]);

    Loads an assembly given its display name, loading the assembly into the domain ofthe caller using the supplied evidence.[C#] public static Assembly Load(string, Evidence);

    Loads the assembly with a Common Object File Format (COFF)-based imagecontaining an emitted assembly.[C#] public static Assembly Load(byte[], byte[], Evidence);

    Exemplu (MSDN)

    [C#]

    using System;

    using System.Reflection;

    class Class1

    {

    public static void Main()

    {Assembly SampleAssembly;

    // You must supply a valid fully qualified assembly name here.

    SampleAssembly = Assembly.Load("Assembly text name, Version,

    Culture, PublicKeyToken");

    Type[] Types = SampleAssembly.GetTypes();

    // Display all the types contained in the specified assembly.

    foreach (Type oType in Types)

    {

    Console.WriteLine(oType.Name.ToString());

    }

    }

    }

    Incarcare assembly ca fisiere de date

    Metoda LoadFrom folosita in acest caz pentru a incarca un assembly furnizat ca parametru

    in linia de comanda.

    Presupunem ca avem doua assemblies: SomeTool.exe si Component.dll (un assembly ce

    contine anumite componente pe care le foloseste SomeTool.exe si acestea sunt instalate in:

    C:\SomeTool\SomeTool.exe

    C:\SomeTool\Component.dll

  • 8/10/2019 6.CLR AppDomain Reflection

    17/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 17

    Presupunem ca mai exista un assembly cu acelasi nume, Component.dll dar situat in

    radacina discului C:.

    Utilizatorul va folosi SomeTools.exe pentru a incarca assembly C:\Component.dll si nu cel

    din directorul curent.

    C:\>C:\SomeTool\SomeTool.exe C:\Component.dll

    SomeTool.exe va incarca assembly C:\Component.dll folosind metoda LoadFrom,

    pasindu-i ca parametru argumentul din linia de comanda.

    CLR va incarca acest assembly. Presupunem ca in metoda Main se face apel la o alta

    metoda ce face referinta la un obiect din Component.dll.

    Ce se va intimpla?

    Va folosi CLR assembly incarcat sau va incarca assembly din directorul curent?

    Deoarece assembly C:\Component.dll a fost incarcat ca un fisier , CLR nu poate sti ca

    Component.dll a fost incarcat, si ca atare va incarca assembly

    C:\SomeTool\Component.dll.

    Algoritmul pentru LoadFrom

    La executia metodei LoadFrom, CLR deschide fisierul specificat si extrage informatii

    referitaore la versiune, cultura si cheia publica din metadata fisierului, apoi intern CLR

    apeleaza metoda Load, pasindu-i informatia de mai sus. Daca un asemenea assembly este

    gasit, CLR compara calea completa a assembly-ului cu cea furnizata in LoadFrom si in caz

    ca sunt identice, va incarca acel assembly.

    Daca parametrii sunt diferiti sau daca Load nu gaseste un asemenea fisier, assembly este

    considerat ca fiind fisier de date si ca atare nu constituie o parte normala a aplicatiei.

    Utilizarea metodei LoadFrom este descurajata de catre documentatia MS, in principal pe

    considerente de viteza de executie si pe faptul ca un assembly incarcat cu aceasta metoda

    este considerat fisier de date , si deci nu face parte din AppDomain.

    Construirea unei ierarhii a tipurilor derivate din Exception

    Exemplul de mai jos afiseaza toate clasele ce sunt derivate in ultima instanta din

    System.Exception.

    Pentru a face acest lucru este necesar sa examinam tipurile din mai multe assemblies.

    Aplicatia va trebui sa incarce in mod explicit toate assemblies pe care vrem sa le

    scanam .

    using System;

    using System.Text;

    using System.Reflection;

    using System.Collections;

    class App

    {

    static void Main()

    {

    // Incarcam in mod explicit assembly pe care

    // vrem sa aplicam reflection

  • 8/10/2019 6.CLR AppDomain Reflection

    18/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 18

    LoadAssemblies(); // metoda proprie

    // Initializare contoare

    // totalTypes = numar total tipuri

    // totalExceptionType = numar total tipuri exceptii

    // exceptionTree = lista cu tipuri de exceptii

    Int32 totalTypes = 0, totalExceptionTypes = 0;

    ArrayList exceptionTree = new ArrayList();

    // Iteram prin toate assemblies

    // incarcate in acest AppDomain

    foreach (Assembly a in

    AppDomain.CurrentDomain.GetAssemblies())

    {

    // Iteram prin toate tipurile definite in acest assembly

    foreach (Type t in a.GetTypes())

    {

    totalTypes++;

    // Ignoram tipul daca nu este o clasa publicaif (!t.IsClass || !t.IsPublic) continue;

    // Construim un string al ierarhiei

    // de derivare a tipului.

    StringBuilder typeHierarchy =

    new StringBuilder(t.FullName, 5000);

    // Presupunem ca tipul nu este derivat din Exception

    Boolean derivedFromException = false;

    // Cercetam sa vedem daca System.Exception

    // este tipul de baza pentru acest tip

    Type baseType = t.BaseType;while ((baseType != null) && !derivedFromException)

    {

    // Adaugam tipul de baza la sfarsitul listei

    typeHierarchy.Append("-" + baseType);

    derivedFromException =

    (baseType == typeof(System.Exception));

    baseType = baseType.BaseType;

    }

    // Controlam urmatorul tip

    if (!derivedFromException) continue;

    // Am gasit un tip derivat din Exception

    totalExceptionTypes++;

    // Pentru acest tip derivat din Exception,

    // inversam ordinea tipurilor in ierarhie

    String[] h = typeHierarchy.ToString().Split(-);

    Array.Reverse(h);

    // Construim un nou string cu ierarhia in ordinea

  • 8/10/2019 6.CLR AppDomain Reflection

    19/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 19

    // Exception -> tip derivat din Exception.

    // Adaugam stringul la lista tipurilor Exception

    exceptionTree.Add(String.Join("-", h, 1, h.Length -

    1));

    }

    }

    // Sortam tipurile Exception in ordinea ierarhiei lor.

    exceptionTree.Sort();

    // Afisam arborescenta Exception.

    foreach (String s in exceptionTree)

    {

    // Pentru acest tip Exception,

    // separam tipul de baza sa.

    String[] x = s.Split(-);

    // Indentam pe baza numarului de tipuri de baza.

    Console.WriteLine(new String( , 3 * x.Length) + x[x.Length - 1]);

    }

    // Afisam starea finala a tipului considerat.

    Console.WriteLine("\n> Of {0} types, {1} are " +

    "derived from System.Exception.",

    totalTypes, totalExceptionTypes);

    Console.ReadLine();

    }

    static void LoadAssemblies()

    {

    String[] assemblies = {

    "System, PublicKeyToken={0}","System.Data, PublicKeyToken={0}",

    "System.Design, PublicKeyToken={1}",

    "System.DirectoryServices, PublicKeyToken={1}",

    "System.Drawing, PublicKeyToken={1}",

    "System.Drawing.Design, PublicKeyToken={1}",

    "System.EnterpriseServices, PublicKeyToken={1}",

    "System.Management, PublicKeyToken={1}",

    "System.Messaging, PublicKeyToken={1}",

    "System.Runtime.Remoting, PublicKeyToken={0}",

    "System.Security, PublicKeyToken={1}",

    "System.ServiceProcess, PublicKeyToken={1}",

    "System.Web, PublicKeyToken={1}",

    "System.Web.RegularExpressions, PublicKeyToken={1}",

    "System.Web.Services, PublicKeyToken={1}",

    "System.Windows.Forms, PublicKeyToken={0}",

    "System.Xml, PublicKeyToken={0}",

    };

    String EcmaPublicKeyToken = "b77a5c561934e089";

    String MSPublicKeyToken = "b03f5f7f11d50a3a";

    // Obtinem versiunea assembly ce contine System.Object.

    // Vom presupune aceeasi versiune

    // pentru toate celelate assemblies.

  • 8/10/2019 6.CLR AppDomain Reflection

    20/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 20

    Version version =

    typeof(System.Object).Assembly.GetName().Version;

    // Incarcam explicit assembly pe care vrem sa

    // aplicam reflection

    foreach (String a in assemblies)

    {

    String AssemblyIdentity =

    String.Format(a, EcmaPublicKeyToken,

    MSPublicKeyToken) +

    ", Culture=neutral, Version=" + version;

    Assembly.Load(AssemblyIdentity);

    }

    }

    }

    Rezultatul este:

    System.ApplicationException

    System.Reflection.InvalidFilterCriteriaException

    System.Reflection.TargetException

    System.Reflection.TargetInvocationExceptionSystem.Reflection.TargetParameterCountException

    System.IO.IsolatedStorage.IsolatedStorageException

    System.Runtime.Remoting.MetadataServices.SUDSGeneratorException

    System.Runtime.Remoting.MetadataServices.SUDSParserException

    System.SystemException

    System.AppDomainUnloadedException

    System.ArgumentException

    System.ArgumentNullException

    .............................................

    Of 7281 types, 135 are derived from System.Exception.

    Explicatie asupra codului:String[] assemblies = {

    "System, PublicKeyToken={0}",

    "System.Data, PublicKeyToken={0}",

    "System.Design, PublicKeyToken={1}",

    "System.DirectoryServices, PublicKeyToken={1}",

    "System.Drawing, PublicKeyToken={1}",

    "System.Drawing.Design, PublicKeyToken={1}",

    "System.EnterpriseServices, PublicKeyToken={1}",

    ...

    Ideea construirii acestui string, se gaseste in algoritmul folosit pentru construirea identitatii

    unui assembly

    foreach (String a in assemblies){

    String AssemblyIdentity =

    String.Format(a, EcmaPublicKeyToken,

    MSPublicKeyToken) +

    ", Culture=neutral, Version=" + version;

    ...

    altfel spus stringul assemblies contine si specificatorii de format.

    Rezultatul executiei codului de mai sus este (partial) :

  • 8/10/2019 6.CLR AppDomain Reflection

    21/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 21

    assemblies = System, PublicKeyToken={0}

    AssemblyIdentity = System, PublicKeyToken=b77a5c561934e089, Culture=neutral,

    Version=1.0.5000.0

    assemblies = System.Data, PublicKeyToken={0}

    AssemblyIdentity = System.Data, PublicKeyToken=b77a5c561934e089, Culture=neutral,

    Version=1.0.5000.0assemblies = System.Design, PublicKeyToken={1}

    AssemblyIdentity = System.Design, PublicKeyToken=b03f5f7f11d50a3a,

    Culture=neutral, Version=1.0.5000.0

    ...

    Cateva explicatii

    Metoda String.Split

    // string seperated by colons ';'

    string info = "mark;smith;123 csharp drive;toronto;canada";

    string[] arInfo = new string[4];

    // define which character is seperating fieldschar[] splitter = {';'};

    arInfo = info.Split(splitter);

    for(int x = 0; x < arInfo.Length; x++)

    {

    Console.WriteLine(arInfo[x] + "
    ");

    }

    Rezultatul este:

    mark

    smith

    123 csharp drive

    toronto

    canada

    Descarcarea explicita a unui assembly: descarcarea unui AppDomain

    CLR nu suporta abilitatea de a descarca un assembly. In loc de aceasta trebuie sa

    descarcam un AppDomain ce are ca efect descarcarea tuturor assemblies din cadrul

    acestuia.

    Descarcarea unui AppDomain se face apeland metoda Unload, ce are drept parametru o

    refrerinta la un AppDomain.

    Important : Assembly care sunt incarcati intr-un AppDomain neutral nu pot fi descarcati

    niciodata. Un AppDomain neutral este descarcat cand procesul se termina.

    Exemplu de creare a unui AppDomain, transfer de date prin referinta in afara AppDomain.

    using System;

    using System.Reflection;

    using System.Threading;

    class App

    {

    static void Main()

  • 8/10/2019 6.CLR AppDomain Reflection

    22/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 22

    {

    // Creaza un AppDomain nou.

    AppDomain ad =

    AppDomain.CreateDomain("MyNewAppDomain", null, null);

    // Creaza un obiect MarshalByRef in noul AppDomain

    MarshalByRefType mbrt = (MarshalByRefType)ad.CreateInstanceAndUnwrap(

    Assembly.GetCallingAssembly().FullName,"MarshalByRefType");

    // Apeleaza o metoda pe acest obiect.

    // Proxy redirecteaza apelul catre alt AppDomain

    mbrt.SomeMethod(Thread.GetDomain().FriendlyName);

    // Am terminat cu acest AppDomain.

    // Il descarcam si implicit toate assemblies

    // pe care le contine.

    AppDomain.Unload(ad);

    // Incercam sa apelam o metoda pe un alt obiect

    // din AppDomain ce a fost descarcat.

    // Din acest motiv se va lansa o exceptie.

    try

    {

    mbrt.SomeMethod(Thread.GetDomain().FriendlyName);

    // Urmatoarea linie nu va fi afisata.

    Console.WriteLine(

    "Called SomeMethod on object in other AppDomain.\n" +

    "This shouldnt happen.");

    }catch (AppDomainUnloadedException)

    {

    // Am prins exceptia si o tratam.

    Console.WriteLine(

    "Fail to call SomeMethod on object in other

    AppDomain.\n" +

    "This should happen.");

    }

    Console.ReadLine();

    }

    }

    // Un tip derivat din MarshalByRefObject.

    class MarshalByRefType : MarshalByRefObject

    {

    // Aceasta metoda de instanta poate fi apelata via proxy.

    public void SomeMethod(String sourceAppDomain)

    {

    // Afisam numele AppDomain apelat si al AppDomain curent.

    // Firul aplicatiei a facut tranzitia intre AppDomain.

  • 8/10/2019 6.CLR AppDomain Reflection

    23/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Ioan Asiminoaei 23

    Console.WriteLine(

    "Code from the {0} AppDomain\n" +

    "called into the {1} AppDomain.",

    sourceAppDomain, Thread.GetDomain().FriendlyName);

    }

    }

    Iesirea este:Code from the 'p7_appdomain.exe' AppDomain

    called into the 'MyNewAppDomain' AppDomain.

    Fail to call SomeMethod on object in other AppDomain.

    This should happen.

    System.Collections Namespace

    The System.Collectionsnamespace contains interfaces and classes that definevarious collections of objects, such as lists, queues, bit arrays, hashtables and

    dictionaries.Namespace hierarchy

    ClassesClass Description

    ArrayList Implements the IListinterface using anarray whose size is dynamically increasedas required.

    BitArray Manages a compact array of bit values,

    which are represented as Booleans, wheretrueindicates that the bit is on (1) andfalseindicates the bit is off (0).

    CaseInsensitiveComparer Compares two objects for equivalence,

    ignoring the case of strings.

    CaseInsensitiveHashCodeProvider Supplies a hash code for an object, using ahashing algorithm that ignores the case ofstrings.

    CollectionBase Provides the abstract (MustInheritin

    Visual Basic) base class for a stronglytyped collection.

    Comparer Compares two objects for equivalence,where string comparisons are case-

    sensitive.

    DictionaryBase Provides the abstract (MustInheritinVisual Basic) base class for a stronglytyped collection of key-and-value pairs.

    Hashtable Represents a collection of key-and-value

    pairs that are organized based on the hash

    code of the key.Queue Represents a first-in, first-out collection of

    objects.

    ReadOnlyCollectionBase Provides the abstract (MustInheritinVisual Basic) base class for a stronglytyped read-only collection.

    SortedList Represents a collection of key-and-valuepairs that are sorted by the keys and are

    accessible by key and by index.

  • 8/10/2019 6.CLR AppDomain Reflection

    24/24

    CLR. AppDomain. Reflection

    Facultatea de Informatica Iasi Universitatea Al I. Cuza Iasi 21.01.2007

    Stack Represents a simple last-in-first-outcollection of objects.

    Interfaces

    Interface Description

    ICollection Defines size, enumerators andsynchronization methods for all collections.

    IComparer Exposes a method that compares twoobjects.

    IDictionary Represents a collection of key-and-valuepairs.

    IDictionaryEnumerator Enumerates the elements of a dictionary.

    IEnumerable Exposes the enumerator, which supports asimple iteration over a collection.

    IEnumerator Supports a simple iteration over acollection.

    IHashCodeProvider Supplies a hash code for an object, using acustom hash function.

    IList Represents a collection of objects that canbe individually accessed by index.

    StructuresStructure Description

    DictionaryEntry Defines a dictionary key-and-value pairthat can be set or retrieved.