AppDomain.CreateInstanceAndUnwrap Methode

Definition

Erstellt eine neue Instanz eines angegebenen Typs.Creates a new instance of a specified type.

Überlädt

CreateInstanceAndUnwrap(String, String)

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben die Assembly, in der der Typ definiert ist, und den Namen des Typs an.Parameters specify the assembly where the type is defined, and the name of the type.

CreateInstanceAndUnwrap(String, String, Object[])

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben die Assembly an, in der der Typ definiert ist, und den Namen des Typs und ein Array von Aktivierungsattributen.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[])

Erstellt eine neue Instanz des angegebenen, in der angegebenen Assembly definierten Typs, die angibt, ob die Groß-/Kleinschreibung des Typnamens ignoriert wird, außerdem die Bindungsattribute und den Binder, mit denen der zu erstellende Typ ausgewählt wird, die Argumente des Konstruktors, die Kultur und die Aktivierungsattribute.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)

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben den Namen des Typs an und wie er gesucht und erstellt werden kann.Parameters specify the name of the type, and how it is found and created.

CreateInstanceAndUnwrap(String, String)

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben die Assembly, in der der Typ definiert ist, und den Namen des Typs an.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

Parameter

assemblyName
String

Der Anzeigename der Assembly.The display name of the assembly. Siehe FullName.See FullName.

typeName
String

Der vollqualifizierte Name des angeforderten Typs einschließlich des Namespace, jedoch ohne die Assembly, wie er von der FullName-Eigenschaft zurückgegeben wird.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

Gibt zurück

Eine Instanz des durch typeName angegebenen Objekts.An instance of the object specified by typeName.

Ausnahmen

assemblyName oder typeName ist null.assemblyName or typeName is null.

Es wurde kein übereinstimmender öffentlicher Konstruktor gefunden.No matching public constructor was found.

typename wurde in assemblyName nicht gefunden.typename was not found in assemblyName.

assemblyName wurde nicht gefunden.assemblyName was not found.

Der Aufrufer hat keine Berechtigung zum Aufrufen dieses Konstruktors.The caller does not have permission to call this constructor.

Der Vorgang wird für eine entladene Anwendungsdomäne ausgeführt.The operation is attempted on an unloaded application domain.

assemblyName ist keine gültige Assembly.assemblyName is not a valid assembly.

- oder --or- Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und assemblyName wurde mit einer höheren Version kompiliert.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Eine Assembly oder ein Modul wurde zweimal mit zwei unterschiedlichen Beweisen geladen.An assembly or module was loaded twice with two different evidences.

Beispiele

Das folgende Codebeispiel zeigt die einfachste Methode zum Ausführen von Code in einer anderen Anwendungsdomäne.The following code example shows the simplest way to execute code in another application domain. Das Beispiel definiert eine Klasse mit dem Namen Worker, die von MarshalByRefObjecterbt.The example defines a class named Worker that inherits from MarshalByRefObject. Die Worker-Klasse definiert eine Methode, die den Namen der Anwendungsdomäne anzeigt, in der Sie ausgeführt wird.The Worker class defines a method that displays the name of the application domain in which it is executing. Im Beispiel werden Instanzen von Worker in der Standard Anwendungsdomäne und in einer neuen Anwendungsdomäne erstellt.The example creates instances of Worker in the default application domain and in a new application domain.

Hinweis

Die Assembly, die Worker enthält, muss in beide Anwendungs Domänen geladen werden. es können jedoch auch andere Assemblys geladen werden, die nur in der neuen Anwendungsdomäne vorhanden sind.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"

Hinweise

Dies ist eine bequeme Methode, die CreateInstance und ObjectHandle.Unwrapkombiniert.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. Diese Methode ruft den Parameter losen Konstruktor für typeNameauf.This method calls the parameterless constructor for typeName.

Das Format von assemblyNamefinden Sie unter AssemblyName.See AssemblyName for the format of assemblyName. Das Format von typeNamefinden Sie in der Type.FullName-Eigenschaft.See the Type.FullName property for the format of typeName.

Hinweis

Wenn Sie einen früh gebundenen aufzurufenden Methoden M eines Objekts vom Typ T1 erstellen, das von CreateInstanceAndUnwrapzurückgegeben wurde, und diese Methode einen früh gebundenen Rückruf an eine Methode eines Objekts vom Typ T2 in einer Assembly C von der aktuellen Assembly oder der Assembly, die T1enthält, wird die Assembly C in die aktuelle Anwendungsdomäne geladen.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. Dieses Laden tritt auch dann auf, wenn der früh gebundene aufrufungs T1.M() im Hauptteil einer DynamicMethododer in einem anderen dynamisch generierten Code erfolgt ist.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. Wenn die aktuelle Domäne die Standard Domäne ist, kann der AssemblyC erst entladen werden, wenn der Prozess beendet wird.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Wenn die aktuelle Domäne später versucht, die AssemblyCzu laden, kann der Ladevorgang fehlschlagen.If the current domain later attempts to load assembly C, the load might fail.

Sicherheit

FileIOPermissionAccess
die Möglichkeit, die Datei zu lesen, die das Assemblymanifest enthält, oder, wenn Sie einen Typ aus einem anderen Modul als der Manifest-Datei erstellen.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. Zugehörige Enumeration: ReadAssociated enumeration: Read

WebPermission
die Möglichkeit, auf den Speicherort der Assembly zuzugreifen, wenn die Assembly nicht lokal ist.for the ability to access the location of the assembly if the assembly is not local.

Siehe auch

CreateInstanceAndUnwrap(String, String, Object[])

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben die Assembly an, in der der Typ definiert ist, und den Namen des Typs und ein Array von Aktivierungsattributen.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

Parameter

assemblyName
String

Der Anzeigename der Assembly.The display name of the assembly. Siehe FullName.See FullName.

typeName
String

Der vollqualifizierte Name des angeforderten Typs einschließlich des Namespace, jedoch ohne die Assembly, wie er von der FullName-Eigenschaft zurückgegeben wird.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

activationAttributes
Object[]

Ein Array mit einem oder mehreren Attributen, die an der Aktivierung beteiligt sein können.An array of one or more attributes that can participate in activation. Üblicherweise ein Array, das ein einzelnes UrlAttribute-Objekt enthält, das die zum Aktivieren eines Remoteobjekts erforderliche URL angibt.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

Der Parameter ist vom Client aktivierten Objekten zugeordnet. Die Clientaktivierung ist eine veraltete Technologie, die zum Zweck der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten, jedoch nicht für die Neuentwicklung empfohlen wird.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. Für verteilte Anwendungen sollte stattdessen Windows Communication Foundation verwendet werden.Distributed applications should instead use Windows Communication Foundation.

Gibt zurück

Eine Instanz des durch typeName angegebenen Objekts.An instance of the object specified by typeName.

Ausnahmen

assemblyName oder typeName ist null.assemblyName or typeName is null.

Es wurde kein übereinstimmender öffentlicher Konstruktor gefunden.No matching public constructor was found.

typename wurde in assemblyName nicht gefunden.typename was not found in assemblyName.

assemblyName wurde nicht gefunden.assemblyName was not found.

Der Aufrufer hat keine Berechtigung zum Aufrufen dieses Konstruktors.The caller does not have permission to call this constructor.

Der Aufrufer kann keine Aktivierungsattribute für ein Objekt bereitstellen, das nicht von MarshalByRefObject erbt.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

Der Vorgang wird für eine entladene Anwendungsdomäne ausgeführt.The operation is attempted on an unloaded application domain.

assemblyName ist keine gültige Assembly.assemblyName is not a valid assembly.

- oder --or- Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und assemblyName wurde mit einer höheren Version kompiliert.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Eine Assembly oder ein Modul wurde zweimal mit zwei unterschiedlichen Beweisen geladen.An assembly or module was loaded twice with two different evidences.

Beispiele

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



Hinweise

Dies ist eine bequeme Methode, die CreateInstance und ObjectHandle.Unwrapkombiniert.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. Diese Methode ruft den Parameter losen Konstruktor für typeNameauf.This method calls the parameterless constructor for typeName.

Das Format von assemblyNamefinden Sie unter AssemblyName.See AssemblyName for the format of assemblyName. Das Format von typeNamefinden Sie in der Type.FullName-Eigenschaft.See the Type.FullName property for the format of typeName.

Hinweis

Wenn Sie einen früh gebundenen aufzurufenden Methoden M eines Objekts vom Typ T1 erstellen, das von CreateInstanceAndUnwrapzurückgegeben wurde, und diese Methode einen früh gebundenen Rückruf an eine Methode eines Objekts vom Typ T2 in einer Assembly C von der aktuellen Assembly oder der Assembly, die T1enthält, wird die Assembly C in die aktuelle Anwendungsdomäne geladen.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. Dieses Laden tritt auch dann auf, wenn der früh gebundene aufrufungs T1.M() im Hauptteil einer DynamicMethododer in einem anderen dynamisch generierten Code erfolgt ist.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. Wenn die aktuelle Domäne die Standard Domäne ist, kann der AssemblyC erst entladen werden, wenn der Prozess beendet wird.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Wenn die aktuelle Domäne später versucht, die AssemblyCzu laden, kann der Ladevorgang fehlschlagen.If the current domain later attempts to load assembly C, the load might fail.

Sicherheit

FileIOPermissionAccess
die Möglichkeit, die Datei zu lesen, die das Assemblymanifest enthält.for the ability to read the file containing the assembly manifest. Zugehörige Enumeration: ReadAssociated enumeration: Read

WebPermission
die Möglichkeit, auf den Speicherort der Assembly zuzugreifen, wenn die Assembly nicht lokal ist.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
die Möglichkeit zum Aufruf von nicht verwaltetem Code beim Erstellen einer Instanz eines Delegaten.for the ability to call unmanaged code when creating an instance of a delegate. Zugehörige Enumeration: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
die Möglichkeit, Vorgänge für alle Typmember aufzurufen.for the ability to invoke operations on all type members. Zugehörige Enumeration: MemberAccessAssociated enumeration: MemberAccess

Siehe auch

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

Erstellt eine neue Instanz des angegebenen, in der angegebenen Assembly definierten Typs, die angibt, ob die Groß-/Kleinschreibung des Typnamens ignoriert wird, außerdem die Bindungsattribute und den Binder, mit denen der zu erstellende Typ ausgewählt wird, die Argumente des Konstruktors, die Kultur und die Aktivierungsattribute.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

Parameter

assemblyName
String

Der Anzeigename der Assembly.The display name of the assembly. Siehe FullName.See FullName.

typeName
String

Der vollqualifizierte Name des angeforderten Typs einschließlich des Namespace, jedoch ohne die Assembly, wie er von der FullName-Eigenschaft zurückgegeben wird.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

Ein boolescher Wert, der angibt, ob bei der Suche die Groß-/Kleinschreibung beachtet werden soll.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

Eine Kombination von 0 oder mehr Bitflags, die die Suche nach dem typeName-Konstruktor beeinflussen.A combination of zero or more bit flags that affect the search for the typeName constructor. Wenn bindingAttr 0 ist, wird eine Suche nach öffentlichen Konstruktoren mit Beachtung der Groß-/Kleinschreibung durchgeführt.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

Ein Objekt, das die Bindung, die Umwandlung von Argumenttypen, das Aufrufen von Membern und das Abrufen von MemberInfo-Objekten über Reflektion ermöglicht.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. Wenn binder den Wert null aufweist, wird der Standardbinder verwendet.If binder is null, the default binder is used.

args
Object[]

Die an den Konstruktor zu übergebenden Argumente.The arguments to pass to the constructor. Dieses Array von Argumenten muss hinsichtlich Anzahl, Reihenfolge und Typ mit den Parametern des aufzurufenden Konstruktors übereinstimmen.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. Wenn der parameterlose Konstruktor bevorzugt wird, muss args ein leeres Array oder NULL sein.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

Ein kulturspezifisches Objekt, mit dem die Umwandlung von Typen geregelt wird.A culture-specific object used to govern the coercion of types. Wenn culture den Wert null hat, wird die CultureInfo des aktuellen Threads verwendet.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

Ein Array mit einem oder mehreren Attributen, die an der Aktivierung beteiligt sein können.An array of one or more attributes that can participate in activation. In der Regel ein Array, das ein einzelnes UrlAttribute-Objekt enthält.Typically, an array that contains a single UrlAttribute object. Dies gibt die zum Aktivieren eines Remoteobjekts erforderliche URL an.that specifies the URL that is required to activate a remote object.

Der Parameter ist vom Client aktivierten Objekten zugeordnet.This parameter is related to client-activated objects. Die Clientaktivierung ist eine veraltete Technologie, die zum Zweck der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten, jedoch nicht für die Neuentwicklung empfohlen wird.Client activation is a legacy technology that is retained for backward compatibility but is not recommended for new development. Für verteilte Anwendungen sollte stattdessen Windows Communication Foundation verwendet werden.Distributed applications should instead use Windows Communication Foundation.

Gibt zurück

Eine Instanz des durch typeName angegebenen Objekts.An instance of the object specified by typeName.

Ausnahmen

assemblyName oder typeName ist null.assemblyName or typeName is null.

Es wurde kein übereinstimmender Konstruktor gefunden.No matching constructor was found.

typename wurde in assemblyName nicht gefunden.typename was not found in assemblyName.

assemblyName wurde nicht gefunden.assemblyName was not found.

Der Aufrufer hat keine Berechtigung zum Aufrufen dieses Konstruktors.The caller does not have permission to call this constructor.

Der Aufrufer kann keine Aktivierungsattribute für ein Objekt bereitstellen, das nicht von MarshalByRefObject erbt.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

Der Vorgang wird für eine entladene Anwendungsdomäne ausgeführt.The operation is attempted on an unloaded application domain.

assemblyName ist keine gültige Assembly.assemblyName is not a valid assembly.

- oder --or- assemblyName wurde mit einer Version der Common Language Runtime kompiliert, die höher ist als die Version, die derzeit geladen ist.assemblyName was compiled with a later version of the common language runtime than the version that is currently loaded.

Eine Assembly oder ein Modul wurde zweimal mit zwei unterschiedlichen Beweisen geladen.An assembly or module was loaded twice with two different evidences.

Beispiele

Im folgenden Beispiel wird die Verwendung des ignoreCase-Parameters veranschaulicht.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

Hinweise

Dies ist eine bequeme Methode, die CreateInstance und ObjectHandle.Unwrapkombiniert.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

Das Format von assemblyNamefinden Sie unter AssemblyName.See AssemblyName for the format of assemblyName. Das Format von typeNamefinden Sie in der Type.FullName-Eigenschaft.See the Type.FullName property for the format of typeName.

Hinweis

Wenn Sie einen früh gebundenen aufzurufenden Methoden M eines Objekts vom Typ T1 erstellen, das von CreateInstanceAndUnwrapzurückgegeben wurde, und diese Methode einen früh gebundenen Rückruf an eine Methode eines Objekts vom Typ T2 in einer Assembly C von der aktuellen Assembly oder der Assembly, die T1enthält, wird die Assembly C in die aktuelle Anwendungsdomäne geladen.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. Dieses Laden tritt auch dann auf, wenn der früh gebundene aufrufungs T1.M() im Hauptteil einer DynamicMethododer in einem anderen dynamisch generierten Code erfolgt ist.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. Wenn die aktuelle Domäne die Standard Domäne ist, kann der AssemblyC erst entladen werden, wenn der Prozess beendet wird.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Wenn die aktuelle Domäne später versucht, die AssemblyCzu laden, kann der Ladevorgang fehlschlagen.If the current domain later attempts to load assembly C, the load might fail.

Sicherheit

FileIOPermissionAccess
die Möglichkeit, die Datei zu lesen, die das Assemblymanifest enthält.for the ability to read the file containing the assembly manifest. Zugehörige Enumeration: ReadAssociated enumeration: Read

WebPermission
die Möglichkeit, auf den Speicherort der Assembly zuzugreifen, wenn die Assembly nicht lokal ist.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
die Möglichkeit zum Aufruf von nicht verwaltetem Code beim Erstellen einer Instanz eines Delegaten.for the ability to call unmanaged code when creating an instance of a delegate. Zugehörige Enumeration: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
die Möglichkeit, Vorgänge für alle Typmember aufzurufen.for the ability to invoke operations on all type members. Zugehörige Enumeration: MemberAccessAssociated enumeration: MemberAccess

Siehe auch

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

Warnung

Diese API ist jetzt veraltet.

Erstellt eine neue Instanz des angegebenen Typs.Creates a new instance of the specified type. Parameter geben den Namen des Typs an und wie er gesucht und erstellt werden kann.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 http://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

Parameter

assemblyName
String

Der Anzeigename der Assembly.The display name of the assembly. Siehe FullName.See FullName.

typeName
String

Der vollqualifizierte Name des angeforderten Typs einschließlich des Namespace, jedoch ohne die Assembly, wie er von der FullName-Eigenschaft zurückgegeben wird.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

Ein boolescher Wert, der angibt, ob bei der Suche die Groß-/Kleinschreibung beachtet werden soll.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

Eine Kombination von 0 oder mehr Bitflags, die die Suche nach dem typeName-Konstruktor beeinflussen.A combination of zero or more bit flags that affect the search for the typeName constructor. Wenn bindingAttr 0 ist, wird eine Suche nach öffentlichen Konstruktoren mit Beachtung der Groß-/Kleinschreibung durchgeführt.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

Ein Objekt, das die Bindung, die Umwandlung von Argumenttypen, das Aufrufen von Membern und das Abrufen von MemberInfo-Objekten über Reflektion ermöglicht.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. Wenn binder den Wert null aufweist, wird der Standardbinder verwendet.If binder is null, the default binder is used.

args
Object[]

Die an den Konstruktor zu übergebenden Argumente.The arguments to pass to the constructor. Dieses Array von Argumenten muss hinsichtlich Anzahl, Reihenfolge und Typ mit den Parametern des aufzurufenden Konstruktors übereinstimmen.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. Wenn der parameterlose Konstruktor bevorzugt wird, muss args ein leeres Array oder NULL sein.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

Ein kulturspezifisches Objekt, mit dem die Umwandlung von Typen geregelt wird.A culture-specific object used to govern the coercion of types. Wenn culture den Wert null hat, wird die CultureInfo des aktuellen Threads verwendet.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

Ein Array mit einem oder mehreren Attributen, die an der Aktivierung beteiligt sein können.An array of one or more attributes that can participate in activation. Üblicherweise ein Array, das ein einzelnes UrlAttribute-Objekt enthält, das die zum Aktivieren eines Remoteobjekts erforderliche URL angibt.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

Der Parameter ist vom Client aktivierten Objekten zugeordnet.This parameter is related to client-activated objects. Die Clientaktivierung ist eine veraltete Technologie, die zum Zweck der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten, jedoch nicht für die Neuentwicklung empfohlen wird.Client activation is a legacy technology that is retained for backward compatibility but is not recommended for new development. Für verteilte Anwendungen sollte stattdessen Windows Communication Foundation verwendet werden.Distributed applications should instead use Windows Communication Foundation.

securityAttributes
Evidence

Informationen, die zum Autorisieren der Erstellung von typeName verwendet werden.Information used to authorize creation of typeName.

Gibt zurück

Eine Instanz des durch typeName angegebenen Objekts.An instance of the object specified by typeName.

Attribute

Ausnahmen

assemblyName oder typeName ist null.assemblyName or typeName is null.

Es wurde kein übereinstimmender Konstruktor gefunden.No matching constructor was found.

typename wurde in assemblyName nicht gefunden.typename was not found in assemblyName.

assemblyName wurde nicht gefunden.assemblyName was not found.

Der Aufrufer hat keine Berechtigung zum Aufrufen dieses Konstruktors.The caller does not have permission to call this constructor.

Der Aufrufer kann keine Aktivierungsattribute für ein Objekt bereitstellen, das nicht von MarshalByRefObject erbt.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

Der Vorgang wird für eine entladene Anwendungsdomäne ausgeführt.The operation is attempted on an unloaded application domain.

assemblyName ist keine gültige Assembly.assemblyName is not a valid assembly.

- oder --or- Version 2.0 oder höher der Common Language Runtime ist derzeit geladen, und assemblyName wurde mit einer höheren Version kompiliert.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

Eine Assembly oder ein Modul wurde zweimal mit zwei unterschiedlichen Beweisen geladen.An assembly or module was loaded twice with two different evidences.

Beispiele

Im folgenden Beispiel wird die Verwendung des ignoreCase-Parameters veranschaulicht.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

Hinweise

Dies ist eine bequeme Methode, die CreateInstance und ObjectHandle.Unwrapkombiniert.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

Das Format von assemblyNamefinden Sie unter AssemblyName.See AssemblyName for the format of assemblyName. Das Format von typeNamefinden Sie in der Type.FullName-Eigenschaft.See the Type.FullName property for the format of typeName.

Hinweis

Wenn Sie einen früh gebundenen aufzurufenden Methoden M eines Objekts vom Typ T1 erstellen, das von CreateInstanceAndUnwrapzurückgegeben wurde, und diese Methode einen früh gebundenen Rückruf an eine Methode eines Objekts vom Typ T2 in einer Assembly C von der aktuellen Assembly oder der Assembly, die T1enthält, wird die Assembly C in die aktuelle Anwendungsdomäne geladen.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. Dieses Laden tritt auch dann auf, wenn der früh gebundene aufrufungs T1.M() im Hauptteil einer DynamicMethododer in einem anderen dynamisch generierten Code erfolgt ist.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. Wenn die aktuelle Domäne die Standard Domäne ist, kann der AssemblyC erst entladen werden, wenn der Prozess beendet wird.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. Wenn die aktuelle Domäne später versucht, die AssemblyCzu laden, kann der Ladevorgang fehlschlagen.If the current domain later attempts to load assembly C, the load might fail.

Sicherheit

FileIOPermissionAccess
die Möglichkeit, die Datei zu lesen, die das Assemblymanifest enthält.for the ability to read the file containing the assembly manifest. Zugehörige Enumeration: ReadAssociated enumeration: Read

WebPermission
die Möglichkeit, auf den Speicherort der Assembly zuzugreifen, wenn die Assembly nicht lokal ist.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
So laden Sie eine Assembly mit beweisento load an assembly with evidence. Zugeordnete Enumeration: ControlEvidenceAssociated enumeration: ControlEvidence.

ReflectionPermission
die Möglichkeit, Vorgänge für alle Typmember aufzurufen.for the ability to invoke operations on all type members. Zugehörige Enumeration: MemberAccessAssociated enumeration: MemberAccess

Siehe auch

Gilt für: