Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método AppDomain.CreateInstanceFrom (String, String)

 

Publicado: octubre de 2016

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

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

public ObjectHandle CreateInstanceFrom(
	string assemblyFile,
	string typeName
)

Parámetros

assemblyFile
Type: System.String

Nombre, incluida la ruta de acceso, de un archivo que contiene un ensamblado que define el tipo solicitado. El ensamblado se carga mediante el método LoadFrom.

typeName
Type: System.String

Nombre completo del tipo solicitado, incluido el espacio de nombres, pero no el ensamblado, tal y como lo devuelve la propiedad Type.FullName.

Valor devuelto

Type: System.Runtime.Remoting.ObjectHandle

Objeto contenedor de la nueva instancia o null, si no se encuentra el parámetro typeName. El valor devuelto debe desempaquetarse para obtener acceso al objeto real.

Exception Condition
ArgumentNullException

El valor de assemblyFile es null.

O bien

El valor de typeName es null.

FileNotFoundException

assemblyFile no se encontró.

TypeLoadException

typeName no se encontró en assemblyFile.

AppDomainUnloadedException

La operación se intenta en un dominio de aplicación descargado.

MissingMethodException

No se encontró ningún constructor público sin parámetros.

MethodAccessException

El llamador no tiene permisos suficientes para llamar a este constructor.

BadImageFormatException

assemblyFile no es un ensamblado válido.

-o-

La versión 2.0 u otra posterior del Common Language Runtime está cargada actualmente y assemblyFile se compiló con una versión posterior.

FileLoadException

Se cargó un ensamblado o módulo dos veces con dos evidencias diferentes.

NullReferenceException

Esta instancia es null.

El constructor predeterminado para typeName se invoca.

Para obtener más información, vea el método Activator.CreateInstanceFrom.

Cuando el CreateInstanceFrom método se utiliza para crear una instancia en un dominio de aplicación de destino que no sea el dominio de aplicación desde el que se realiza la llamada, el ensamblado se carga en el dominio de aplicación de destino. Sin embargo, si la instancia está sin ajustar en el dominio de aplicación que realiza la llamada, utilizando la instancia sin ajustar en ciertos aspectos puede provocar que el ensamblado se cargue en el dominio de aplicación que realiza la llamada. Por ejemplo, una vez sin ajustar la instancia, se podría solicitar su información de tipo, para poder llamar a sus métodos en tiempo de ejecución. Cuando el ensamblado se carga en el dominio de aplicación que realiza la llamada, pueden producir excepciones.

  • Si previamente se ha cargado otra versión del mismo ensamblado en el dominio de aplicación que realiza la llamada, o si la ruta de acceso de carga del dominio de aplicación que realiza la llamada es diferente del dominio de aplicación de destino, las excepciones como MissingMethodException pueden producirse.

  • Si el dominio de aplicación que realiza la llamada realiza llamadas enlazadas tempranamente en el tipo de instancia, InvalidCastException se puede producir cuando se realiza un intento para convertir la instancia.

En el ejemplo siguiente se muestra cómo utilizar el CreateInstanceFrom(String, String) sobrecarga del método para crear una instancia de un objeto en un dominio de aplicación de destino y llamar a sus métodos.

En el ejemplo se define la MarshallableExample clase, que se puede calcular referencias entre los límites del dominio de aplicación. En el ejemplo se crea una ruta de ensamblado actualmente en ejecución, crea un dominio de aplicación de destino y utiliza el CreateInstanceFrom(String, String) sobrecarga del método para cargar el ensamblado de ejemplo en el dominio de aplicación de destino y crear una instancia de MarshallableExample.

System_CAPS_noteNota

La ruta de acceso es absoluto en este ejemplo, pero una ruta de acceso relativa también funcionaría porque el Assembly.LoadFrom método se utiliza para cargar el ensamblado.

Después de desencapsulado el identificador de objeto, el ejemplo muestra tres maneras de usar un objeto en un dominio de aplicación de destino:

  • Invocar un método con el enlace, utilizando la reflexión. Esto requiere información de tipo, que hace que el ensamblado se cargue en el dominio de aplicación del llamador. (En este ejemplo, ya está cargado.)

  • Convierte el objeto en una interfaz conocida para el llamador y el destinatario. Si la interfaz se define en el ensamblado de llamada o en un ensamblado terceros al que hace referencia el llamador y el destinatario, el ensamblado llamado no se cargó en el dominio de aplicación del llamador.

  • Uso del objeto directamente cuando conoce el tipo al llamador. El ensamblado debe cargarse en el dominio de aplicación del llamador.

Es otra manera de evitar que se cargue el ensamblado llamado en el dominio de aplicación del llamador del llamador se derivan de la MarshalByRefObject clase y definir un método que se puede ejecutar en el dominio de aplicación de destino. Este método puede usar la reflexión para examinar un ensamblado de destino, porque el ensamblado de destino ya está cargado en el dominio de aplicación de destino. Vea el ejemplo de la DynamicDirectory propiedad.

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
Disponible desde 1.1
Volver al principio
Mostrar: