AppDomain.CreateInstanceAndUnwrap Método

Definição

Cria uma nova instância de um tipo especificado.Creates a new instance of a specified type.

Sobrecargas

CreateInstanceAndUnwrap(String, String)

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Parâmetros especificam o assembly no qual o tipo é definido e o nome do tipo.Parameters specify the assembly where the type is defined, and the name of the type.

CreateInstanceAndUnwrap(String, String, Object[])

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Parâmetros especificam o assembly no qual o tipo, o nome do tipo e uma matriz de atributos de ativação são definidos.Parameters specify the assembly where the type is defined, the name of the type, and an array of activation attributes.

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

Cria uma nova instância do tipo indicado definido no assembly especificado, determinando se a diferenciação entre maiúsculas e minúsculas é ignorada no nome do tipo; os atributos de associação e o associador que são usados para selecionar o tipo a ser criado; os argumentos do construtor; a cultura; e os atributos de ativação.Creates a new instance of the specified type defined in the specified assembly, specifying whether the case of the type name is ignored; the binding attributes and the binder that are used to select the type to be created; the arguments of the constructor; the culture; and the activation attributes.

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

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Os parâmetros especificam o nome do tipo e como ele é encontrado e criado.Parameters specify the name of the type, and how it is found and created.

CreateInstanceAndUnwrap(String, String)

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Parâmetros especificam o assembly no qual o tipo é definido e o nome do tipo.Parameters specify the assembly where the type is defined, and the name of the type.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName);
member this.CreateInstanceAndUnwrap : string * string -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String) As Object

Parâmetros

assemblyName
String

O nome para exibição do assembly.The display name of the assembly. Consulte FullName.See FullName.

typeName
String

O nome totalmente qualificado do tipo solicitado, inclusive o namespace, mas não o assembly, como retornado pela propriedade FullName.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

Retornos

Uma instância do objeto especificado por typeName.An instance of the object specified by typeName.

Exceções

assemblyName ou typeName é null.assemblyName or typeName is null.

Nenhum construtor público correspondente foi encontrado.No matching public constructor was found.

typename não foi encontrado em assemblyName.typename was not found in assemblyName.

assemblyName não foi encontrado.assemblyName was not found.

O chamador não tem permissão para chamar esse construtor.The caller does not have permission to call this constructor.

A operação é tentada em um domínio de aplicativo descarregado.The operation is attempted on an unloaded application domain.

assemblyName não é um assembly válido.assemblyName is not a valid assembly.

- ou --or- A versão 2,0 ou posterior do Common Language Runtime está carregada e assemblyName foi compilada com uma versão posterior.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Um assembly ou módulo foi carregado duas vezes em com duas evidências diferentes.An assembly or module was loaded twice with two different evidences.

Exemplos

O exemplo de código a seguir mostra a maneira mais simples de executar o código em outro domínio de aplicativo.The following code example shows the simplest way to execute code in another application domain. O exemplo define uma classe chamada Worker que herda de MarshalByRefObject.The example defines a class named Worker that inherits from MarshalByRefObject. A classe Worker define um método que exibe o nome do domínio do aplicativo no qual está sendo executado.The Worker class defines a method that displays the name of the application domain in which it is executing. O exemplo cria instâncias de Worker no domínio de aplicativo padrão e em um novo domínio de aplicativo.The example creates instances of Worker in the default application domain and in a new application domain.

Observação

O assembly que contém Worker deve ser carregado em ambos os domínios de aplicativo, mas ele pode carregar outros assemblies que existem somente no novo domínio de aplicativo.The assembly that contains Worker must be loaded into both application domains, but it can load other assemblies that exist only in the new application domain.

using namespace System;
using namespace System::Reflection;

public ref class Worker : MarshalByRefObject
{
public:
    void PrintDomain() 
    { 
        Console::WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain::CurrentDomain->FriendlyName); 
    }
};
 
void main()
{
    // Create an ordinary instance in the current AppDomain
    Worker^ localWorker = gcnew Worker();
    localWorker->PrintDomain();
 
    // Create a new application domain, create an instance
    // of Worker in the application domain, and execute code
    // there.
    AppDomain^ ad = AppDomain::CreateDomain("New domain");
    Worker^ remoteWorker = (Worker^) ad->CreateInstanceAndUnwrap(
        Worker::typeid->Assembly->FullName,
        "Worker");
    remoteWorker->PrintDomain();
}

/* This code produces output similar to the following:

Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
 */
using System;
using System.Reflection;
 
public class Worker : MarshalByRefObject
{
    public void PrintDomain() 
    { 
        Console.WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain.CurrentDomain.FriendlyName); 
    }
}
 
class Example
{
    public static void Main()
    {
        // Create an ordinary instance in the current AppDomain
        Worker localWorker = new Worker();
        localWorker.PrintDomain();
 
        // Create a new application domain, create an instance
        // of Worker in the application domain, and execute code
        // there.
        AppDomain ad = AppDomain.CreateDomain("New domain");
        Worker remoteWorker = (Worker) ad.CreateInstanceAndUnwrap(
            typeof(Worker).Assembly.FullName,
            "Worker");
        remoteWorker.PrintDomain();
    }
}

/* This code produces output similar to the following:

Object is executing in AppDomain "source.exe"
Object is executing in AppDomain "New domain"
 */
Imports System.Reflection

Public Class Worker
    Inherits MarshalByRefObject
    
    Public Sub PrintDomain() 
        Console.WriteLine("Object is executing in AppDomain ""{0}""", _
            AppDomain.CurrentDomain.FriendlyName)
    End Sub 
End Class 

Class Example
    
    Public Shared Sub Main() 
        ' Create an ordinary instance in the current AppDomain
        Dim localWorker As New Worker()
        localWorker.PrintDomain()
        
        ' Create a new application domain, create an instance
        ' of Worker in the application domain, and execute code
        ' there.
        Dim ad As AppDomain = AppDomain.CreateDomain("New domain")
        Dim remoteWorker As Worker = CType( _
            ad.CreateInstanceAndUnwrap( _
                GetType(Worker).Assembly.FullName, _
                "Worker"), _
            Worker)
        remoteWorker.PrintDomain()
    
    End Sub 
End Class 

' This code produces output similar to the following:
'
'Object is executing in AppDomain "source.exe"
'Object is executing in AppDomain "New domain"

Comentários

Este é um método prático que combina CreateInstance e ObjectHandle.Unwrap.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. Esse método chama o construtor sem parâmetros para typeName.This method calls the parameterless constructor for typeName.

Consulte AssemblyName para o formato de assemblyName.See AssemblyName for the format of assemblyName. Consulte a propriedade Type.FullName do formato de typeName.See the Type.FullName property for the format of typeName.

Observação

Caso você faça uma chamada Early Bound para um método M de um objeto do tipo T1 que foi retornado por CreateInstanceAndUnwrap e esse método faça uma chamada Early Bound para um método de um objeto do tipo T2 em um assembly C diferente do assembly atual ou do assembly que contém T1, o assembly C é carregado no domínio de aplicativo atual.If you make an early-bound call to a method M of an object of type T1 that was returned by CreateInstanceAndUnwrap, and that method makes an early-bound call to a method of an object of type T2 in an assembly C other than the current assembly or the assembly containing T1, assembly C is loaded into the current application domain. Este carregamento ocorre mesmo se a chamada Early Bound para T1.M() tiver sido feita no corpo de um DynamicMethod ou em outro código gerado dinamicamente.This loading occurs even if the early-bound call to T1.M() was made in the body of a DynamicMethod, or in other dynamically generated code. Caso o domínio atual seja o domínio padrão, o assembly C não pode ser descarregado até o término do processo.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Caso o domínio atual tente carregar posteriormente o assembly C, o carregamento pode falhar.If the current domain later attempts to load assembly C, the load might fail.

Segurança

FileIOPermissionAccess
para a capacidade de ler o arquivo que contém o manifesto do assembly ou se você está criando um tipo de um módulo que não seja o arquivo de manifesto.for the ability to read the file containing the assembly manifest, or if you are creating a type from a module other than the manifest file. Enumeração associada: ReadAssociated enumeration: Read

WebPermission
para a capacidade de acessar o local do conjunto caso o assembly não seja local.for the ability to access the location of the assembly if the assembly is not local.

Veja também

CreateInstanceAndUnwrap(String, String, Object[])

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Parâmetros especificam o assembly no qual o tipo, o nome do tipo e uma matriz de atributos de ativação são definidos.Parameters specify the assembly where the type is defined, the name of the type, and an array of activation attributes.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, cli::array <System::Object ^> ^ activationAttributes);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, object[] activationAttributes);
member this.CreateInstanceAndUnwrap : string * string * obj[] -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, activationAttributes As Object()) As Object

Parâmetros

assemblyName
String

O nome para exibição do assembly.The display name of the assembly. Consulte FullName.See FullName.

typeName
String

O nome totalmente qualificado do tipo solicitado, inclusive o namespace, mas não o assembly, como retornado pela propriedade FullName.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

activationAttributes
Object[]

Uma matriz de um ou mais atributos que podem participar da ativação.An array of one or more attributes that can participate in activation. Normalmente, uma matriz que contém um único objeto UrlAttribute que especifica a URL necessária para ativar um objeto remoto.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

Esse parâmetro está relacionado a objetos ativados pelo cliente. A ativação pelo cliente é uma tecnologia herdada, mantida para compatibilidade com versões anteriores, mas não é recomendada para novos desenvolvimentos.This parameter is related to client-activated objects.Client activation is a legacy technology that is retained for backward compatibility but is not recommended for new development. Em vez disso, os aplicativos distribuídos devem usar o Windows Communication Foundation.Distributed applications should instead use Windows Communication Foundation.

Retornos

Uma instância do objeto especificado por typeName.An instance of the object specified by typeName.

Exceções

assemblyName ou typeName é null.assemblyName or typeName is null.

Nenhum construtor público correspondente foi encontrado.No matching public constructor was found.

typename não foi encontrado em assemblyName.typename was not found in assemblyName.

assemblyName não foi encontrado.assemblyName was not found.

O chamador não tem permissão para chamar esse construtor.The caller does not have permission to call this constructor.

O chamador não pode fornecer atributos de ativação para um objeto que não seja herdado de MarshalByRefObject.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

A operação é tentada em um domínio de aplicativo descarregado.The operation is attempted on an unloaded application domain.

assemblyName não é um assembly válido.assemblyName is not a valid assembly.

- ou --or- A versão 2,0 ou posterior do Common Language Runtime está carregada e assemblyName foi compilada com uma versão posterior.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Um assembly ou módulo foi carregado duas vezes em com duas evidências diferentes.An assembly or module was loaded twice with two different evidences.

Exemplos

using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
using namespace System::Runtime::Remoting;

ref class ADDyno
{
public:
   static Type^ CreateADynamicAssembly( interior_ptr<AppDomain^> myNewDomain, String^ executableNameNoExe )
   {
      String^ executableName = String::Concat( executableNameNoExe, ".exe" );
      AssemblyName^ myAsmName = gcnew AssemblyName;
      myAsmName->Name = executableNameNoExe;
      myAsmName->CodeBase = Environment::CurrentDirectory;
      AssemblyBuilder^ myAsmBuilder = ( *myNewDomain)->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::RunAndSave );
      Console::WriteLine( "-- Dynamic Assembly instantiated." );
      ModuleBuilder^ myModBuilder = myAsmBuilder->DefineDynamicModule( executableNameNoExe, executableName );
      TypeBuilder^ myTypeBuilder = myModBuilder->DefineType( executableNameNoExe, TypeAttributes::Public, MarshalByRefObject::typeid );
      array<Type^>^temp0 = nullptr;
      MethodBuilder^ myFCMethod = myTypeBuilder->DefineMethod( "CountLocalFiles", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::Static), nullptr, temp0 );
      MethodInfo^ currentDirGetMI = Environment::typeid->GetProperty( "CurrentDirectory" )->GetGetMethod();
      array<Type^>^temp1 = {String::typeid};
      MethodInfo^ writeLine0objMI = Console::typeid->GetMethod( "WriteLine", temp1 );
      array<Type^>^temp2 = {String::typeid,Object::typeid,Object::typeid};
      MethodInfo^ writeLine2objMI = Console::typeid->GetMethod( "WriteLine", temp2 );
      array<Type^>^temp3 = {String::typeid};
      MethodInfo^ getFilesMI = Directory::typeid->GetMethod( "GetFiles", temp3 );
      myFCMethod->InitLocals = true;
      ILGenerator^ myFCIL = myFCMethod->GetILGenerator();
      Console::WriteLine( "-- Generating MSIL method body..." );
      LocalBuilder^ v0 = myFCIL->DeclareLocal( String::typeid );
      LocalBuilder^ v1 = myFCIL->DeclareLocal( int::typeid );
      LocalBuilder^ v2 = myFCIL->DeclareLocal( String::typeid );
      LocalBuilder^ v3 = myFCIL->DeclareLocal( array<String^>::typeid );
      Label evalForEachLabel = myFCIL->DefineLabel();
      Label topOfForEachLabel = myFCIL->DefineLabel();

      // Build the method body.
      myFCIL->EmitCall( OpCodes::Call, currentDirGetMI, nullptr );
      myFCIL->Emit( OpCodes::Stloc_S, v0 );
      myFCIL->Emit( OpCodes::Ldc_I4_0 );
      myFCIL->Emit( OpCodes::Stloc_S, v1 );
      myFCIL->Emit( OpCodes::Ldstr, "---" );
      myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );
      myFCIL->Emit( OpCodes::Ldloc_S, v0 );
      myFCIL->EmitCall( OpCodes::Call, getFilesMI, nullptr );
      myFCIL->Emit( OpCodes::Stloc_S, v3 );
      myFCIL->Emit( OpCodes::Br_S, evalForEachLabel );

      // foreach loop starts here.
      myFCIL->MarkLabel( topOfForEachLabel );

      // Load array of strings and index, store value at index for output.
      myFCIL->Emit( OpCodes::Ldloc_S, v3 );
      myFCIL->Emit( OpCodes::Ldloc_S, v1 );
      myFCIL->Emit( OpCodes::Ldelem_Ref );
      myFCIL->Emit( OpCodes::Stloc_S, v2 );
      myFCIL->Emit( OpCodes::Ldloc_S, v2 );
      myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );

      // Increment counter by one.
      myFCIL->Emit( OpCodes::Ldloc_S, v1 );
      myFCIL->Emit( OpCodes::Ldc_I4_1 );
      myFCIL->Emit( OpCodes::Add );
      myFCIL->Emit( OpCodes::Stloc_S, v1 );

      // Determine if end of file list array has been reached.
      myFCIL->MarkLabel( evalForEachLabel );
      myFCIL->Emit( OpCodes::Ldloc_S, v1 );
      myFCIL->Emit( OpCodes::Ldloc_S, v3 );
      myFCIL->Emit( OpCodes::Ldlen );
      myFCIL->Emit( OpCodes::Conv_I4 );
      myFCIL->Emit( OpCodes::Blt_S, topOfForEachLabel );

      //foreach loop end here.
      myFCIL->Emit( OpCodes::Ldstr, "---" );
      myFCIL->EmitCall( OpCodes::Call, writeLine0objMI, nullptr );
      myFCIL->Emit( OpCodes::Ldstr, "There are {0} files in {1}." );
      myFCIL->Emit( OpCodes::Ldloc_S, v1 );
      myFCIL->Emit( OpCodes::Box, int::typeid );
      myFCIL->Emit( OpCodes::Ldloc_S, v0 );
      myFCIL->EmitCall( OpCodes::Call, writeLine2objMI, nullptr );
      myFCIL->Emit( OpCodes::Ret );
      Type^ myType = myTypeBuilder->CreateType();
      myAsmBuilder->SetEntryPoint( myFCMethod );
      myAsmBuilder->Save( executableName );
      Console::WriteLine( "-- Method generated, type completed, and assembly saved to disk." );
      return myType;
   }
};

int main()
{
   String^ domainDir;
   String^ executableName = nullptr;
   Console::Write( "Enter a name for the file counting assembly: " );
   String^ executableNameNoExe = Console::ReadLine();
   executableName = String::Concat( executableNameNoExe, ".exe" );
   Console::WriteLine( "---" );
   domainDir = Environment::CurrentDirectory;
   AppDomain^ curDomain = Thread::GetDomain();

   // Create a new AppDomain, with the current directory as the base.
   Console::WriteLine( "Current Directory: {0}", Environment::CurrentDirectory );
   AppDomainSetup^ mySetupInfo = gcnew AppDomainSetup;
   mySetupInfo->ApplicationBase = domainDir;
   mySetupInfo->ApplicationName = executableNameNoExe;
   mySetupInfo->LoaderOptimization = LoaderOptimization::SingleDomain;
   AppDomain^ myDomain = AppDomain::CreateDomain( executableNameNoExe, nullptr, mySetupInfo );
   Console::WriteLine( "Creating a new AppDomain '{0}'...", executableNameNoExe );
   Console::WriteLine( "-- Base Directory = '{0}'", myDomain->BaseDirectory );
   Console::WriteLine( "-- Shadow Copy? = '{0}'", myDomain->ShadowCopyFiles );
   Console::WriteLine( "---" );
   Type^ myFCType = ADDyno::CreateADynamicAssembly(  &curDomain, executableNameNoExe );
   Console::WriteLine( "Loading '{0}' from '{1}'...", executableName, myDomain->BaseDirectory );
   BindingFlags bFlags = static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::CreateInstance | BindingFlags::Instance);
   Object^ myObjInstance = myDomain->CreateInstanceAndUnwrap( executableNameNoExe, executableNameNoExe, false, bFlags, nullptr, nullptr, nullptr, nullptr, nullptr );
   Console::WriteLine( "Executing method 'CountLocalFiles' in {0}...", myObjInstance );
   array<Object^>^temp4 = nullptr;
   myFCType->InvokeMember( "CountLocalFiles", BindingFlags::InvokeMethod, nullptr, myObjInstance, temp4 );
}

using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting;

class ADDyno

{

   public static Type CreateADynamicAssembly(ref AppDomain myNewDomain,
                         string executableNameNoExe)
   {

    string executableName = executableNameNoExe + ".exe";

    AssemblyName myAsmName = new AssemblyName();
    myAsmName.Name = executableNameNoExe;
    myAsmName.CodeBase = Environment.CurrentDirectory;

    AssemblyBuilder myAsmBuilder = myNewDomain.DefineDynamicAssembly(myAsmName,
                        AssemblyBuilderAccess.RunAndSave);
    Console.WriteLine("-- Dynamic Assembly instantiated.");

    ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule(executableNameNoExe,
                                      executableName);

    TypeBuilder myTypeBuilder = myModBuilder.DefineType(executableNameNoExe,
                        TypeAttributes.Public,
                        typeof(MarshalByRefObject));

    MethodBuilder myFCMethod = myTypeBuilder.DefineMethod("CountLocalFiles",
                        MethodAttributes.Public |
                        MethodAttributes.Static,
                        null,
                        new Type[] {  });

    MethodInfo currentDirGetMI = typeof(Environment).GetProperty("CurrentDirectory").GetGetMethod();
    MethodInfo writeLine0objMI = typeof(Console).GetMethod("WriteLine",
                     new Type[] { typeof(string) });
    MethodInfo writeLine2objMI = typeof(Console).GetMethod("WriteLine",
                     new Type[] { typeof(string), typeof(object), typeof(object) });
    MethodInfo getFilesMI = typeof(Directory).GetMethod("GetFiles", 
                new Type[] { typeof(string) });

    myFCMethod.InitLocals = true;

    ILGenerator myFCIL = myFCMethod.GetILGenerator();

    Console.WriteLine("-- Generating MSIL method body...");
    LocalBuilder v0 = myFCIL.DeclareLocal(typeof(string));
    LocalBuilder v1 = myFCIL.DeclareLocal(typeof(int));
    LocalBuilder v2 = myFCIL.DeclareLocal(typeof(string));
    LocalBuilder v3 = myFCIL.DeclareLocal(typeof(string[]));

    Label evalForEachLabel = myFCIL.DefineLabel();
    Label topOfForEachLabel = myFCIL.DefineLabel();

    // Build the method body.

    myFCIL.EmitCall(OpCodes.Call, currentDirGetMI, null);
    myFCIL.Emit(OpCodes.Stloc_S, v0);
    myFCIL.Emit(OpCodes.Ldc_I4_0);
    myFCIL.Emit(OpCodes.Stloc_S, v1);
    myFCIL.Emit(OpCodes.Ldstr, "---");
    myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);
    myFCIL.Emit(OpCodes.Ldloc_S, v0);
    myFCIL.EmitCall(OpCodes.Call, getFilesMI, null);
    myFCIL.Emit(OpCodes.Stloc_S, v3);

    myFCIL.Emit(OpCodes.Br_S, evalForEachLabel);

    // foreach loop starts here.
    myFCIL.MarkLabel(topOfForEachLabel);
    
        // Load array of strings and index, store value at index for output.
    myFCIL.Emit(OpCodes.Ldloc_S, v3);
    myFCIL.Emit(OpCodes.Ldloc_S, v1);
    myFCIL.Emit(OpCodes.Ldelem_Ref);
    myFCIL.Emit(OpCodes.Stloc_S, v2);

    myFCIL.Emit(OpCodes.Ldloc_S, v2);
    myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);

    // Increment counter by one.
    myFCIL.Emit(OpCodes.Ldloc_S, v1);
    myFCIL.Emit(OpCodes.Ldc_I4_1);
    myFCIL.Emit(OpCodes.Add);
    myFCIL.Emit(OpCodes.Stloc_S, v1);

    // Determine if end of file list array has been reached.
    myFCIL.MarkLabel(evalForEachLabel);
    myFCIL.Emit(OpCodes.Ldloc_S, v1);
    myFCIL.Emit(OpCodes.Ldloc_S, v3);
    myFCIL.Emit(OpCodes.Ldlen);
    myFCIL.Emit(OpCodes.Conv_I4);
    myFCIL.Emit(OpCodes.Blt_S, topOfForEachLabel);
    //foreach loop end here.

    myFCIL.Emit(OpCodes.Ldstr, "---");
    myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, null);
    myFCIL.Emit(OpCodes.Ldstr, "There are {0} files in {1}.");
    myFCIL.Emit(OpCodes.Ldloc_S, v1);
    myFCIL.Emit(OpCodes.Box, typeof(int));
    myFCIL.Emit(OpCodes.Ldloc_S, v0);
    myFCIL.EmitCall(OpCodes.Call, writeLine2objMI, null);

    myFCIL.Emit(OpCodes.Ret);

    Type myType = myTypeBuilder.CreateType();

    myAsmBuilder.SetEntryPoint(myFCMethod);
    myAsmBuilder.Save(executableName);		
    Console.WriteLine("-- Method generated, type completed, and assembly saved to disk."); 

    return myType;

   }

   public static void Main() 
   {

    string domainDir, executableName = null;
    
    Console.Write("Enter a name for the file counting assembly: ");
    string executableNameNoExe = Console.ReadLine();
    executableName = executableNameNoExe + ".exe";
    Console.WriteLine("---");

    domainDir = Environment.CurrentDirectory;

    AppDomain curDomain = Thread.GetDomain();	


    // Create a new AppDomain, with the current directory as the base.

    Console.WriteLine("Current Directory: {0}", Environment.CurrentDirectory);
    AppDomainSetup mySetupInfo = new AppDomainSetup();
    mySetupInfo.ApplicationBase = domainDir;
    mySetupInfo.ApplicationName = executableNameNoExe;
    mySetupInfo.LoaderOptimization = LoaderOptimization.SingleDomain;

    AppDomain myDomain = AppDomain.CreateDomain(executableNameNoExe,
                    null, mySetupInfo);

    Console.WriteLine("Creating a new AppDomain '{0}'...",
                    executableNameNoExe);

    Console.WriteLine("-- Base Directory = '{0}'", myDomain.BaseDirectory); 
    Console.WriteLine("-- Shadow Copy? = '{0}'", myDomain.ShadowCopyFiles); 

    Console.WriteLine("---");
    Type myFCType = CreateADynamicAssembly(ref curDomain, 
                     executableNameNoExe);

    Console.WriteLine("Loading '{0}' from '{1}'...", executableName,
              myDomain.BaseDirectory.ToString());


    BindingFlags bFlags = (BindingFlags.Public | BindingFlags.CreateInstance |
                   BindingFlags.Instance);

    Object myObjInstance = myDomain.CreateInstanceAndUnwrap(executableNameNoExe,
                executableNameNoExe, false, bFlags, 
                null, null, null, null, null);

    Console.WriteLine("Executing method 'CountLocalFiles' in {0}...",
               myObjInstance.ToString());

    myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, null,
                myObjInstance, new object[] { });
            
        
   }

}

Imports System.IO
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
Imports System.Runtime.Remoting



Class ADDyno
   
   
   
   Public Shared Function CreateADynamicAssembly(ByRef myNewDomain As AppDomain, executableNameNoExe As String) As Type
      
      Dim executableName As String = executableNameNoExe + ".exe"
      
      Dim myAsmName As New AssemblyName()
      myAsmName.Name = executableNameNoExe
      myAsmName.CodeBase = Environment.CurrentDirectory
      
      Dim myAsmBuilder As AssemblyBuilder = myNewDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave)
      Console.WriteLine("-- Dynamic Assembly instantiated.")
      
      Dim myModBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule(executableNameNoExe, executableName)
      
      Dim myTypeBuilder As TypeBuilder = myModBuilder.DefineType(executableNameNoExe, TypeAttributes.Public, GetType(MarshalByRefObject))
      
      Dim myFCMethod As MethodBuilder = myTypeBuilder.DefineMethod("CountLocalFiles", MethodAttributes.Public Or MethodAttributes.Static, Nothing, New Type() {})
      
      Dim currentDirGetMI As MethodInfo = GetType(Environment).GetProperty("CurrentDirectory").GetGetMethod()
      Dim writeLine0objMI As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() {GetType(String)})
      Dim writeLine2objMI As MethodInfo = GetType(Console).GetMethod("WriteLine", New Type() {GetType(String), GetType(Object), GetType(Object)})
      Dim getFilesMI As MethodInfo = GetType(Directory).GetMethod("GetFiles", New Type() {GetType(String)})
      
      myFCMethod.InitLocals = True
      
      Dim myFCIL As ILGenerator = myFCMethod.GetILGenerator()
      
      Console.WriteLine("-- Generating MSIL method body...")
      Dim v0 As LocalBuilder = myFCIL.DeclareLocal(GetType(String))
      Dim v1 As LocalBuilder = myFCIL.DeclareLocal(GetType(Integer))
      Dim v2 As LocalBuilder = myFCIL.DeclareLocal(GetType(String))
      Dim v3 As LocalBuilder = myFCIL.DeclareLocal(GetType(String()))
      
      Dim evalForEachLabel As Label = myFCIL.DefineLabel()
      Dim topOfForEachLabel As Label = myFCIL.DefineLabel()
      
      ' Build the method body.
      myFCIL.EmitCall(OpCodes.Call, currentDirGetMI, Nothing)
      myFCIL.Emit(OpCodes.Stloc_S, v0)
      myFCIL.Emit(OpCodes.Ldc_I4_0)
      myFCIL.Emit(OpCodes.Stloc_S, v1)
      myFCIL.Emit(OpCodes.Ldstr, "---")
      myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
      myFCIL.Emit(OpCodes.Ldloc_S, v0)
      myFCIL.EmitCall(OpCodes.Call, getFilesMI, Nothing)
      myFCIL.Emit(OpCodes.Stloc_S, v3)
      
      myFCIL.Emit(OpCodes.Br_S, evalForEachLabel)
      
      ' foreach loop starts here.
      myFCIL.MarkLabel(topOfForEachLabel)
      
      ' Load array of strings and index, store value at index for output.
      myFCIL.Emit(OpCodes.Ldloc_S, v3)
      myFCIL.Emit(OpCodes.Ldloc_S, v1)
      myFCIL.Emit(OpCodes.Ldelem_Ref)
      myFCIL.Emit(OpCodes.Stloc_S, v2)
      
      myFCIL.Emit(OpCodes.Ldloc_S, v2)
      myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
      
      ' Increment counter by one.
      myFCIL.Emit(OpCodes.Ldloc_S, v1)
      myFCIL.Emit(OpCodes.Ldc_I4_1)
      myFCIL.Emit(OpCodes.Add)
      myFCIL.Emit(OpCodes.Stloc_S, v1)
      
      ' Determine if end of file list array has been reached.
      myFCIL.MarkLabel(evalForEachLabel)
      myFCIL.Emit(OpCodes.Ldloc_S, v1)
      myFCIL.Emit(OpCodes.Ldloc_S, v3)
      myFCIL.Emit(OpCodes.Ldlen)
      myFCIL.Emit(OpCodes.Conv_I4)
      myFCIL.Emit(OpCodes.Blt_S, topOfForEachLabel)
      'foreach loop end here.
      myFCIL.Emit(OpCodes.Ldstr, "---")
      myFCIL.EmitCall(OpCodes.Call, writeLine0objMI, Nothing)
      myFCIL.Emit(OpCodes.Ldstr, "There are {0} files in {1}.")
      myFCIL.Emit(OpCodes.Ldloc_S, v1)
      myFCIL.Emit(OpCodes.Box, GetType(Integer))
      myFCIL.Emit(OpCodes.Ldloc_S, v0)
      myFCIL.EmitCall(OpCodes.Call, writeLine2objMI, Nothing)
      
      myFCIL.Emit(OpCodes.Ret)
      
      Dim myType As Type = myTypeBuilder.CreateType()
      
      myAsmBuilder.SetEntryPoint(myFCMethod)
      myAsmBuilder.Save(executableName)
      Console.WriteLine("-- Method generated, type completed, and assembly saved to disk.")
      
      Return myType
   End Function 'CreateADynamicAssembly
    
   
   Public Shared Sub Main()
      
      Dim executableName As String = Nothing
      Dim domainDir As String
      
      Console.Write("Enter a name for the file counting assembly: ")
      Dim executableNameNoExe As String = Console.ReadLine()
      executableName = executableNameNoExe + ".exe"
      Console.WriteLine("---")
      
      domainDir = Environment.CurrentDirectory
      
      Dim curDomain As AppDomain = Thread.GetDomain()
      
      
      ' Create a new AppDomain, with the current directory as the base.
      Console.WriteLine("Current Directory: {0}", Environment.CurrentDirectory)
      Dim mySetupInfo As New AppDomainSetup()
      mySetupInfo.ApplicationBase = domainDir
      mySetupInfo.ApplicationName = executableNameNoExe
      mySetupInfo.LoaderOptimization = LoaderOptimization.SingleDomain
      
      Dim myDomain As AppDomain = AppDomain.CreateDomain(executableNameNoExe, Nothing, mySetupInfo)
      
      Console.WriteLine("Creating a new AppDomain '{0}'...", executableNameNoExe)
      
      Console.WriteLine("-- Base Directory = '{0}'", myDomain.BaseDirectory)
      Console.WriteLine("-- Shadow Copy? = '{0}'", myDomain.ShadowCopyFiles)
      
      Console.WriteLine("---")
      Dim myFCType As Type = CreateADynamicAssembly(curDomain, executableNameNoExe)
      
      Console.WriteLine("Loading '{0}' from '{1}'...", executableName, myDomain.BaseDirectory.ToString())
      
      
      Dim bFlags As BindingFlags = BindingFlags.Public Or BindingFlags.CreateInstance Or BindingFlags.Instance
      
      Dim myObjInstance As [Object] = myDomain.CreateInstanceAndUnwrap(executableNameNoExe, executableNameNoExe, False, bFlags, Nothing, Nothing, Nothing, Nothing, Nothing)
      
      Console.WriteLine("Executing method 'CountLocalFiles' in {0}...", myObjInstance.ToString())
      
      myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, Nothing, myObjInstance, New Object() {})
   End Sub
End Class



Comentários

Este é um método prático que combina CreateInstance e ObjectHandle.Unwrap.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. Esse método chama o construtor sem parâmetros para typeName.This method calls the parameterless constructor for typeName.

Consulte AssemblyName para o formato de assemblyName.See AssemblyName for the format of assemblyName. Consulte a propriedade Type.FullName do formato de typeName.See the Type.FullName property for the format of typeName.

Observação

Caso você faça uma chamada Early Bound para um método M de um objeto do tipo T1 que foi retornado por CreateInstanceAndUnwrap e esse método faça uma chamada Early Bound para um método de um objeto do tipo T2 em um assembly C diferente do assembly atual ou do assembly que contém T1, o assembly C é carregado no domínio de aplicativo atual.If you make an early-bound call to a method M of an object of type T1 that was returned by CreateInstanceAndUnwrap, and that method makes an early-bound call to a method of an object of type T2 in an assembly C other than the current assembly or the assembly containing T1, assembly C is loaded into the current application domain. Este carregamento ocorre mesmo se a chamada Early Bound para T1.M() tiver sido feita no corpo de um DynamicMethod ou em outro código gerado dinamicamente.This loading occurs even if the early-bound call to T1.M() was made in the body of a DynamicMethod, or in other dynamically generated code. Caso o domínio atual seja o domínio padrão, o assembly C não pode ser descarregado até o término do processo.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Caso o domínio atual tente carregar posteriormente o assembly C, o carregamento pode falhar.If the current domain later attempts to load assembly C, the load might fail.

Segurança

FileIOPermissionAccess
para a capacidade de ler o arquivo que contém o manifesto do assembly.for the ability to read the file containing the assembly manifest. Enumeração associada: ReadAssociated enumeration: Read

WebPermission
para a capacidade de acessar o local do conjunto caso o assembly não seja local.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
para a capacidade de chamar código não gerenciado durante a criação de uma instância de um representante.for the ability to call unmanaged code when creating an instance of a delegate. Enumeração associada: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
a capacidade de invocar operações em todos os membros do tipo.for the ability to invoke operations on all type members. Enumeração associada: MemberAccessAssociated enumeration: MemberAccess

Veja também

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

Cria uma nova instância do tipo indicado definido no assembly especificado, determinando se a diferenciação entre maiúsculas e minúsculas é ignorada no nome do tipo; os atributos de associação e o associador que são usados para selecionar o tipo a ser criado; os argumentos do construtor; a cultura; e os atributos de ativação.Creates a new instance of the specified type defined in the specified assembly, specifying whether the case of the type name is ignored; the binding attributes and the binder that are used to select the type to be created; the arguments of the constructor; the culture; and the activation attributes.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes);
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes);
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] -> obj

Parâmetros

assemblyName
String

O nome para exibição do assembly.The display name of the assembly. Consulte FullName.See FullName.

typeName
String

O nome totalmente qualificado do tipo solicitado, inclusive o namespace, mas não o assembly, como retornado pela propriedade FullName.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

Um valor booliano especificando se é necessário executar uma pesquisa que diferencie maiúsculas de minúsculas ou não.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

Uma combinação de zero ou mais sinalizadores de bit que afetam a pesquisa do construtor typeName.A combination of zero or more bit flags that affect the search for the typeName constructor. Caso bindingAttr seja zero, uma pesquisa que diferencia maiúsculas de minúsculas para construtores públicos é realizada.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

Um objeto que permite a associação, a coerção de tipos de argumento, a invocação de membros e a recuperação de objetos MemberInfo usando reflexão.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. Caso binder seja nulo, o associador padrão é usado.If binder is null, the default binder is used.

args
Object[]

Os argumentos a serem passados para o construtor.The arguments to pass to the constructor. Esta matriz de argumentos deve corresponder em número, ordem e digitar os parâmetros do construtor a ser invocado.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. Caso haja preferência pelo construtor sem parâmetros, args precisará ser uma matriz vazia ou nulo.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

Um objeto específico da cultura usado para controlar a coerção de tipos.A culture-specific object used to govern the coercion of types. Caso culture seja null, CultureInfo para o thread atual é usado.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

Uma matriz de um ou mais atributos que podem participar da ativação.An array of one or more attributes that can participate in activation. Normalmente, uma matriz que contém um único objeto UrlAttribute.Typically, an array that contains a single UrlAttribute object. que especifica a URL necessária para ativar um objeto remoto.that specifies the URL that is required to activate a remote object.

Esse parâmetro está relacionado a objetos ativados pelo cliente.This parameter is related to client-activated objects. A ativação do cliente é uma tecnologia herdada, mantida para compatibilidade com versões anteriores, mas não é recomendada para novos desenvolvimentos.Client activation is a legacy technology that is retained for backward compatibility but is not recommended for new development. Em vez disso, os aplicativos distribuídos devem usar o Windows Communication Foundation.Distributed applications should instead use Windows Communication Foundation.

Retornos

Uma instância do objeto especificado por typeName.An instance of the object specified by typeName.

Exceções

assemblyName ou typeName é null.assemblyName or typeName is null.

Nenhum construtor correspondente foi encontrado.No matching constructor was found.

typename não foi encontrado em assemblyName.typename was not found in assemblyName.

assemblyName não foi encontrado.assemblyName was not found.

O chamador não tem permissão para chamar esse construtor.The caller does not have permission to call this constructor.

O chamador não pode fornecer atributos de ativação para um objeto que não seja herdado de MarshalByRefObject.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

A operação é tentada em um domínio de aplicativo descarregado.The operation is attempted on an unloaded application domain.

assemblyName não é um assembly válido.assemblyName is not a valid assembly.

- ou --or- assemblyName foi compilado com uma versão posterior do Common Language Runtime do que a versão carregada atualmente.assemblyName was compiled with a later version of the common language runtime than the version that is currently loaded.

Um assembly ou módulo foi carregado duas vezes em com duas evidências diferentes.An assembly or module was loaded twice with two different evidences.

Exemplos

O exemplo a seguir demonstra o uso do parâmetro ignoreCase.The following sample demonstrates the use of the ignoreCase parameter.

using namespace System;
using namespace System::Reflection;
static void InstantiateINT32( bool ignoreCase )
{
   try
   {
      AppDomain^ currentDomain = AppDomain::CurrentDomain;
      Object^ instance = currentDomain->CreateInstanceAndUnwrap( 
         "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
         "SYSTEM.INT32", 
         ignoreCase, 
         BindingFlags::Default, 
         nullptr, 
         nullptr, 
         nullptr, 
         nullptr, 
         nullptr );
      Console::WriteLine( instance->GetType() );
   }
   catch ( TypeLoadException^ e ) 
   {
      Console::WriteLine( e->Message );
   }

}

int main()
{
   InstantiateINT32( false ); // Failed!
   InstantiateINT32( true ); // OK!
}

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, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "SYSTEM.INT32",
            ignoreCase,
            BindingFlags.Default,
            null,
            null,
            null,
            null,
            null
         );
         Console.WriteLine(instance.GetType());
      } catch (TypeLoadException e) {
         Console.WriteLine(e.Message);
      }
   }
}
Imports System.Reflection

Module Test

   Sub Main()
      InstantiateINT32(False)	' Failed!
      InstantiateINT32(True)	' OK!
   End Sub

   Sub InstantiateINT32(ignoreCase As Boolean)
      Try
         Dim currentDomain As AppDomain = AppDomain.CurrentDomain
         Dim instance As Object = currentDomain.CreateInstanceAndUnwrap( _
            "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", _
            "SYSTEM.INT32", _
            ignoreCase, _
            BindingFlags.Default, _
            Nothing, _
            Nothing, _
            Nothing, _
            Nothing, _
            Nothing  _
         )
         Console.WriteLine(instance.GetType())
      Catch e As TypeLoadException
         Console.WriteLine(e.Message)
      End Try
   End Sub

End Module 'Test

Comentários

Este é um método prático que combina CreateInstance e ObjectHandle.Unwrap.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

Consulte AssemblyName para o formato de assemblyName.See AssemblyName for the format of assemblyName. Consulte a propriedade Type.FullName do formato de typeName.See the Type.FullName property for the format of typeName.

Observação

Caso você faça uma chamada Early Bound para um método M de um objeto do tipo T1 que foi retornado por CreateInstanceAndUnwrap e esse método faça uma chamada Early Bound para um método de um objeto do tipo T2 em um assembly C diferente do assembly atual ou do assembly que contém T1, o assembly C é carregado no domínio de aplicativo atual.If you make an early-bound call to a method M of an object of type T1 that was returned by CreateInstanceAndUnwrap, and that method makes an early-bound call to a method of an object of type T2 in an assembly C other than the current assembly or the assembly containing T1, assembly C is loaded into the current application domain. Este carregamento ocorre mesmo se a chamada Early Bound para T1.M() tiver sido feita no corpo de um DynamicMethod ou em outro código gerado dinamicamente.This loading occurs even if the early-bound call to T1.M() was made in the body of a DynamicMethod, or in other dynamically generated code. Caso o domínio atual seja o domínio padrão, o assembly C não pode ser descarregado até o término do processo.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Caso o domínio atual tente carregar posteriormente o assembly C, o carregamento pode falhar.If the current domain later attempts to load assembly C, the load might fail.

Segurança

FileIOPermissionAccess
para a capacidade de ler o arquivo que contém o manifesto do assembly.for the ability to read the file containing the assembly manifest. Enumeração associada: ReadAssociated enumeration: Read

WebPermission
para a capacidade de acessar o local do conjunto caso o assembly não seja local.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
para a capacidade de chamar código não gerenciado durante a criação de uma instância de um representante.for the ability to call unmanaged code when creating an instance of a delegate. Enumeração associada: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
a capacidade de invocar operações em todos os membros do tipo.for the ability to invoke operations on all type members. Enumeração associada: MemberAccessAssociated enumeration: MemberAccess

Veja também

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

Aviso

Esta API agora é obsoleta.

Cria uma nova instância do tipo especificado.Creates a new instance of the specified type. Os parâmetros especificam o nome do tipo e como ele é encontrado e criado.Parameters specify the name of the type, and how it is found and created.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, bool ignoreCase, System::Reflection::BindingFlags bindingAttr, System::Reflection::Binder ^ binder, cli::array <System::Object ^> ^ args, System::Globalization::CultureInfo ^ culture, cli::array <System::Object ^> ^ activationAttributes, System::Security::Policy::Evidence ^ securityAttributes);
[System.Obsolete("Use an overload that does not take an Evidence parameter")]
[System.Obsolete("Methods which use evidence to sandbox are obsolete and will be removed in a future release of the .NET Framework. Please use an overload of CreateInstanceAndUnwrap which does not take an Evidence parameter. See https://go.microsoft.com/fwlink/?LinkID=155570 for more information.")]
public object CreateInstanceAndUnwrap (string assemblyName, string typeName, bool ignoreCase, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, object[] args, System.Globalization.CultureInfo culture, object[] activationAttributes, System.Security.Policy.Evidence securityAttributes);
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> obj

Parâmetros

assemblyName
String

O nome para exibição do assembly.The display name of the assembly. Consulte FullName.See FullName.

typeName
String

O nome totalmente qualificado do tipo solicitado, inclusive o namespace, mas não o assembly, como retornado pela propriedade FullName.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

Um valor booliano especificando se é necessário executar uma pesquisa que diferencie maiúsculas de minúsculas ou não.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

Uma combinação de zero ou mais sinalizadores de bit que afetam a pesquisa do construtor typeName.A combination of zero or more bit flags that affect the search for the typeName constructor. Caso bindingAttr seja zero, uma pesquisa que diferencia maiúsculas de minúsculas para construtores públicos é realizada.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

Um objeto que permite a associação, a coerção de tipos de argumento, a invocação de membros e a recuperação de objetos MemberInfo usando reflexão.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. Caso binder seja nulo, o associador padrão é usado.If binder is null, the default binder is used.

args
Object[]

Os argumentos a serem passados para o construtor.The arguments to pass to the constructor. Esta matriz de argumentos deve corresponder em número, ordem e digitar os parâmetros do construtor a ser invocado.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. Caso haja preferência pelo construtor sem parâmetros, args precisará ser uma matriz vazia ou nulo.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

Um objeto específico da cultura usado para controlar a coerção de tipos.A culture-specific object used to govern the coercion of types. Caso culture seja null, CultureInfo para o thread atual é usado.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

Uma matriz de um ou mais atributos que podem participar da ativação.An array of one or more attributes that can participate in activation. Normalmente, uma matriz que contém um único objeto UrlAttribute que especifica a URL necessária para ativar um objeto remoto.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

Esse parâmetro está relacionado a objetos ativados pelo cliente.This parameter is related to client-activated objects. A ativação do cliente é uma tecnologia herdada, mantida para compatibilidade com versões anteriores, mas não é recomendada para novos desenvolvimentos.Client activation is a legacy technology that is retained for backward compatibility but is not recommended for new development. Em vez disso, os aplicativos distribuídos devem usar o Windows Communication Foundation.Distributed applications should instead use Windows Communication Foundation.

securityAttributes
Evidence

Informações usadas para autorizar a criação de typeName.Information used to authorize creation of typeName.

Retornos

Uma instância do objeto especificado por typeName.An instance of the object specified by typeName.

Atributos

Exceções

assemblyName ou typeName é null.assemblyName or typeName is null.

Nenhum construtor correspondente foi encontrado.No matching constructor was found.

typename não foi encontrado em assemblyName.typename was not found in assemblyName.

assemblyName não foi encontrado.assemblyName was not found.

O chamador não tem permissão para chamar esse construtor.The caller does not have permission to call this constructor.

O chamador não pode fornecer atributos de ativação para um objeto que não seja herdado de MarshalByRefObject.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

A operação é tentada em um domínio de aplicativo descarregado.The operation is attempted on an unloaded application domain.

assemblyName não é um assembly válido.assemblyName is not a valid assembly.

- ou --or- A versão 2,0 ou posterior do Common Language Runtime está carregada e assemblyName foi compilada com uma versão posterior.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Um assembly ou módulo foi carregado duas vezes em com duas evidências diferentes.An assembly or module was loaded twice with two different evidences.

Exemplos

O exemplo a seguir demonstra o uso do parâmetro ignoreCase.The following sample demonstrates the use of the ignoreCase parameter.

using namespace System;
using namespace System::Reflection;
static void InstantiateINT32( bool ignoreCase )
{
   try
   {
      AppDomain^ currentDomain = AppDomain::CurrentDomain;
      Object^ instance = currentDomain->CreateInstanceAndUnwrap( 
         "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", 
         "SYSTEM.INT32", 
         ignoreCase, 
         BindingFlags::Default, 
         nullptr, 
         nullptr, 
         nullptr, 
         nullptr, 
         nullptr );
      Console::WriteLine( instance->GetType() );
   }
   catch ( TypeLoadException^ e ) 
   {
      Console::WriteLine( e->Message );
   }

}

int main()
{
   InstantiateINT32( false ); // Failed!
   InstantiateINT32( true ); // OK!
}

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, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "SYSTEM.INT32",
            ignoreCase,
            BindingFlags.Default,
            null,
            null,
            null,
            null,
            null
         );
         Console.WriteLine(instance.GetType());
      } catch (TypeLoadException e) {
         Console.WriteLine(e.Message);
      }
   }
}
Imports System.Reflection

Module Test

   Sub Main()
      InstantiateINT32(False)	' Failed!
      InstantiateINT32(True)	' OK!
   End Sub

   Sub InstantiateINT32(ignoreCase As Boolean)
      Try
         Dim currentDomain As AppDomain = AppDomain.CurrentDomain
         Dim instance As Object = currentDomain.CreateInstanceAndUnwrap( _
            "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", _
            "SYSTEM.INT32", _
            ignoreCase, _
            BindingFlags.Default, _
            Nothing, _
            Nothing, _
            Nothing, _
            Nothing, _
            Nothing  _
         )
         Console.WriteLine(instance.GetType())
      Catch e As TypeLoadException
         Console.WriteLine(e.Message)
      End Try
   End Sub

End Module 'Test

Comentários

Este é um método prático que combina CreateInstance e ObjectHandle.Unwrap.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

Consulte AssemblyName para o formato de assemblyName.See AssemblyName for the format of assemblyName. Consulte a propriedade Type.FullName do formato de typeName.See the Type.FullName property for the format of typeName.

Observação

Caso você faça uma chamada Early Bound para um método M de um objeto do tipo T1 que foi retornado por CreateInstanceAndUnwrap e esse método faça uma chamada Early Bound para um método de um objeto do tipo T2 em um assembly C diferente do assembly atual ou do assembly que contém T1, o assembly C é carregado no domínio de aplicativo atual.If you make an early-bound call to a method M of an object of type T1 that was returned by CreateInstanceAndUnwrap, and that method makes an early-bound call to a method of an object of type T2 in an assembly C other than the current assembly or the assembly containing T1, assembly C is loaded into the current application domain. Este carregamento ocorre mesmo se a chamada Early Bound para T1.M() tiver sido feita no corpo de um DynamicMethod ou em outro código gerado dinamicamente.This loading occurs even if the early-bound call to T1.M() was made in the body of a DynamicMethod, or in other dynamically generated code. Caso o domínio atual seja o domínio padrão, o assembly C não pode ser descarregado até o término do processo.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Caso o domínio atual tente carregar posteriormente o assembly C, o carregamento pode falhar.If the current domain later attempts to load assembly C, the load might fail.

Segurança

FileIOPermissionAccess
para a capacidade de ler o arquivo que contém o manifesto do assembly.for the ability to read the file containing the assembly manifest. Enumeração associada: ReadAssociated enumeration: Read

WebPermission
para a capacidade de acessar o local do conjunto caso o assembly não seja local.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
para carregar um assembly com evidências.to load an assembly with evidence. Enumeração associada: ControlEvidence.Associated enumeration: ControlEvidence.

ReflectionPermission
a capacidade de invocar operações em todos os membros do tipo.for the ability to invoke operations on all type members. Enumeração associada: MemberAccessAssociated enumeration: MemberAccess

Veja também

Aplica-se a