Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo AppDomain.CreateInstanceFrom (String, String)

 

Data di pubblicazione: ottobre 2016

Crea una nuova istanza del tipo specificato definito nel file di assembly specificato.

Spazio dei nomi:   System
Assembly:  mscorlib (in mscorlib.dll)

public ObjectHandle CreateInstanceFrom(
	string assemblyFile,
	string typeName
)

Parametri

assemblyFile
Type: System.String

Nome di un file, comprensivo di percorso, contenente un assembly in cui viene definito il tipo richiesto. L'assembly viene caricato usando il metodo LoadFrom.

typeName
Type: System.String

Nome completo del tipo richiesto, compreso lo spazio dei nomi ed escluso l'assembly, restituito dalla proprietà Type.FullName.

Valore restituito

Type: System.Runtime.Remoting.ObjectHandle

Wrapper per la nuova istanza oppure null se typeName non viene trovato. Per accedere all'oggetto reale è necessario rimuovere il wrapping del valore restituito.

Exception Condition
ArgumentNullException

assemblyFile è null.

-oppure-

typeName è null.

FileNotFoundException

Il parametro assemblyFile non è stato trovato.

TypeLoadException

Non è possibile trovare typeName in assemblyFile.

AppDomainUnloadedException

L'operazione viene tentata in un dominio dell'applicazione non caricato.

MissingMethodException

È stato trovato alcun costruttore pubblico senza parametri.

MethodAccessException

Il chiamante non ha autorizzazioni sufficienti per chiamare il costruttore.

BadImageFormatException

assemblyFile non è un assembly valido.

-oppure-

Attualmente è caricata la versione 2.0 o successiva di Common Language Runtime e l'oggetto assemblyFile è stato compilato con una versione successiva.

FileLoadException

Un assembly o un modulo è stato caricato due volte con due evidenze diverse.

NullReferenceException

Questa istanza è null.

Il costruttore predefinito per typeName viene richiamato.

Per altre informazioni, vedere il metodo Activator.CreateInstanceFrom.

Quando il CreateInstanceFrom metodo viene utilizzato per creare un'istanza in un dominio di applicazione di destinazione diverso dal dominio di applicazione da cui viene effettuata la chiamata, l'assembly viene caricato nel dominio dell'applicazione di destinazione. Tuttavia, se l'istanza è annullato il wrapping nel dominio dell'applicazione chiamante, utilizzando l'istanza annullato il wrapping in determinati modi può causare l'assembly nel dominio applicazione chiamante deve essere caricata. Ad esempio, dopo che l'istanza è annullato il wrapping, potrebbero richiedere le informazioni sul tipo, per chiamare i metodi ad associazione tardiva. Quando l'assembly viene caricato nel dominio applicazione chiamante, possono verificarsi eccezioni.

  • Se un'altra versione dello stesso assembly in precedenza è stata caricata nel dominio applicazione chiamante oppure se il percorso di caricamento del dominio applicazione chiamante è diverso da quello del dominio dell'applicazione di destinazione, le eccezioni, ad esempio MissingMethodException possono verificarsi.

  • Se il dominio applicazione chiamante effettua chiamate ad associazione anticipata per il tipo di istanza InvalidCastException può essere generata quando viene effettuato un tentativo di cast dell'istanza.

Nell'esempio seguente viene illustrato come utilizzare il CreateInstanceFrom(String, String) overload del metodo per creare un'istanza di un oggetto in un dominio di applicazione di destinazione e chiamarne i metodi.

Nell'esempio viene definita la MarshallableExample classe, che può essere sottoposto a marshalling attraverso i limiti del dominio applicazione. Nell'esempio viene compilato un percorso per l'assembly attualmente in esecuzione, crea un dominio di applicazione di destinazione e utilizza il CreateInstanceFrom(String, String) overload del metodo per caricare l'assembly di esempio nel dominio applicazione di destinazione e creare un'istanza di MarshallableExample.

System_CAPS_noteNota

Il percorso è assoluto in questo esempio, ma un percorso relativo funzionerà anche perché il Assembly.LoadFrom metodo viene utilizzato per caricare l'assembly.

Dopo l'annullamento del wrapping l'handle di oggetto, l'esempio illustra tre modi per utilizzare un oggetto in un dominio di applicazione di destinazione:

  • Richiama un metodo con associazione tardiva, tramite reflection. Ciò richiede informazioni sul tipo, determinando l'assembly da caricare nel dominio applicazione del chiamante. (In questo esempio, è già caricato.)

  • Il cast dell'oggetto a un'interfaccia definita per il chiamante e chiamato. Se l'interfaccia è definita nell'assembly chiamante o in un terzo assembly a cui fa riferimento il chiamante e chiamato, l'assembly chiamato non è caricato nel dominio applicazione del chiamante.

  • Utilizzo dell'oggetto direttamente quando il relativo tipo è noto al chiamante. L'assembly deve essere caricato nel dominio applicazione del chiamante.

È possibile evitare di caricare l'assembly chiamato nel dominio applicazione del chiamante per il chiamante da cui derivare la MarshalByRefObject classe e per definire un metodo che può essere eseguito nel dominio dell'applicazione di destinazione. Tale metodo può usare la reflection per esaminare un assembly di destinazione, perché l'assembly di destinazione è già caricato nel dominio applicazione di destinazione. Vedere l'esempio per la DynamicDirectory proprietà.

using System;

public interface ITest
{
    void Test(string greeting);
}

public class MarshallableExample : MarshalByRefObject, ITest
{
    static void Main()
    {
        // Construct a path to the current assembly.
        string assemblyPath = Environment.CurrentDirectory + "\\" +
            typeof(MarshallableExample).Assembly.GetName().Name + ".exe";

        AppDomain ad = AppDomain.CreateDomain("MyDomain");

        System.Runtime.Remoting.ObjectHandle oh = 
            ad.CreateInstanceFrom(assemblyPath, "MarshallableExample");

        object obj = oh.Unwrap();


        // Three ways to use the newly created object, depending on how
        // much is known about the type: Late bound, early bound through 
        // a mutually known interface, or early binding of a known type.
        //
        obj.GetType().InvokeMember("Test", 
            System.Reflection.BindingFlags.InvokeMethod, 
            Type.DefaultBinder, obj, new object[] { "Hello" });

        ITest it = (ITest) obj;
        it.Test("Hi");

        MarshallableExample ex = (MarshallableExample) obj;
        ex.Test("Goodbye");
    }

    public void Test(string greeting)
    {
        Console.WriteLine("{0} from '{1}'!", greeting,
            AppDomain.CurrentDomain.FriendlyName);
    }
}

/* This example produces the following output:

Hello from 'MyDomain'!
Hi from 'MyDomain'!
Goodbye from 'MyDomain'!
 */

FileIOPermissionAccess

for the ability to access the location of the assembly. Associated enumeration: F:System.Security.Permissions.FileIOPermissionAccess.PathDiscovery

FileIOPermissionAccess

for the ability to read the file containing the assembly manifest. Associated enumeration: F:System.Security.Permissions.FileIOPermissionAccess.Read

WebPermission

for the ability to access the location of the assembly if the assembly is not local.

.NET Framework
Disponibile da 1.1
Torna all'inizio
Mostra: