AppDomain.CreateInstanceAndUnwrap 메서드

정의

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of a specified type.

오버로드

CreateInstanceAndUnwrap(String, String)

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식이 정의되는 어셈블리와 해당 형식의 이름을 지정합니다.Parameters specify the assembly where the type is defined, and the name of the type.

CreateInstanceAndUnwrap(String, String, Object[])

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식이 정의되는 어셈블리, 해당 형식의 이름 및 활성화 특성의 배열을 지정합니다.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[])

형식 이름의 대/소문자를 구분할지 여부, 만들 형식을 선택하는 데 사용되는 바인더와 바인딩 특성, 생성자의 인수, 문화권 및 활성화 특성을 지정하여, 지정한 어셈블리에 정의된 지정한 형식의 새 인스턴스를 만듭니다.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)

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식의 이름 및 형식을 찾고 만들 수 있는 방법을 지정합니다.Parameters specify the name of the type, and how it is found and created.

CreateInstanceAndUnwrap(String, String)

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식이 정의되는 어셈블리와 해당 형식의 이름을 지정합니다.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

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다.The display name of the assembly. FullName을 참조하세요.See FullName.

typeName
String

네임스페이스만 포함하고 어셈블리는 포함하지 않는 요청된 형식의 정규화된 이름으로, FullName 속성에 의해 반환됩니다.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

반환

typeName에서 지정한 개체의 인스턴스입니다.An instance of the object specified by typeName.

예외

assemblyName 또는 typeNamenull인 경우assemblyName or typeName is null.

일치하는 public 생성자를 찾을 수 없습니다.No matching public constructor was found.

assemblyName에서 typename을 찾을 수 없습니다.typename was not found in assemblyName.

assemblyName을 찾을 수 없습니다.assemblyName was not found.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.The caller does not have permission to call this constructor.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

assemblyName는 유효한 어셈블리가 아닙니다.assemblyName is not a valid assembly.

또는-or- 버전 2.0 이상의 공용 언어 런타임이 현재 로드되어 있으며 assemblyName가 이후 버전으로 컴파일되었습니다.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

어셈블리 또는 모듈이 서로 다른 두 증명 정보로 두 번 로드되었습니다.An assembly or module was loaded twice with two different evidences.

예제

다음 코드 예제에는 다른 애플리케이션 도메인에서 코드를 실행 하는 가장 간단한 방법은 보여 줍니다.The following code example shows the simplest way to execute code in another application domain. 이 예제에서는 MarshalByRefObject에서 상속 되는 Worker 라는 클래스를 정의 합니다.The example defines a class named Worker that inherits from MarshalByRefObject. Worker 클래스 실행 되는 애플리케이션 도메인의 이름을 표시 하는 메서드를 정의 합니다.The Worker class defines a method that displays the name of the application domain in which it is executing. 인스턴스를 만듭니다 Worker 기본 애플리케이션 도메인에 새 애플리케이션 도메인입니다.The example creates instances of Worker in the default application domain and in a new application domain.

참고

포함 된 어셈블리 Worker 두 애플리케이션 도메인에 로드 해야 하지만 새 애플리케이션 도메인에만 존재 하는 다른 어셈블리를 로드할 수 있습니다.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"

설명

CreateInstanceObjectHandle.Unwrap을 결합 하는 편리한 방법입니다.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. 이 메서드는 typeName에 대해 매개 변수가 없는 생성자를 호출 합니다.This method calls the parameterless constructor for typeName.

assemblyName형식에 대 한 AssemblyName를 참조 하세요.See AssemblyName for the format of assemblyName. typeName형식에 대 한 Type.FullName 속성을 참조 하세요.See the Type.FullName property for the format of typeName.

참고

메서드에 대 한 초기 바인딩 호출을 수행한 M 형식의 개체의 T1 반환한 CreateInstanceAndUnwrap, 메서드 형식의 개체의 메서드에 초기 바인딩된 호출을 수행 하 고 T2 어셈블리에 C 이외의 합니다 현재 어셈블리 또는 포함 된 어셈블리 T1, 어셈블리 C 현재 애플리케이션 도메인에 로드 됩니다.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. 이 로드는 T1.M()에 대 한 초기 바인딩 호출이 DynamicMethod본문 또는 동적으로 생성 된 다른 코드에 생성 된 경우에도 발생 합니다.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. 현재 도메인이 기본 도메인 인 경우 프로세스가 종료 될 때까지 어셈블리 C를 언로드할 수 없습니다.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. 현재 도메인에서 나중에 어셈블리 C를 로드 하려고 하면 로드에 실패할 수 있습니다.If the current domain later attempts to load assembly C, the load might fail.

보안

FileIOPermissionAccess
어셈블리 매니페스트가 포함 된 파일을 읽을 수 있는 기능 또는 매니페스트 파일이 아닌 모듈에서 형식을 만드는 경우입니다.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. 연결 된 열거형: ReadAssociated enumeration: Read

WebPermission
어셈블리가 로컬이 아닌 경우 어셈블리의 위치에 액세스할 수 있습니다.for the ability to access the location of the assembly if the assembly is not local.

추가 정보

CreateInstanceAndUnwrap(String, String, Object[])

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식이 정의되는 어셈블리, 해당 형식의 이름 및 활성화 특성의 배열을 지정합니다.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

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다.The display name of the assembly. FullName을 참조하세요.See FullName.

typeName
String

네임스페이스만 포함하고 어셈블리는 포함하지 않는 요청된 형식의 정규화된 이름으로, FullName 속성에 의해 반환됩니다.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

activationAttributes
Object[]

활성화할 수 있는 하나 이상의 특성으로 이루어진 배열입니다.An array of one or more attributes that can participate in activation. 일반적으로, 원격 개체를 활성화하는 데 필요한 URL을 지정하는 단일 UrlAttribute 개체가 포함된 배열입니다.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

이 매개 변수는 클라이언트 활성 개체와 관련이 있습니다. 클라이언트 활성화는 이전 버전과의 호환성을 위해 유지되지만 새로운 개발에는 권장되지 않는 레거시 기술입니다.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. 분산된 애플리케이션은 Windows Communication Foundation을 사용해야 합니다.Distributed applications should instead use Windows Communication Foundation.

반환

typeName에서 지정한 개체의 인스턴스입니다.An instance of the object specified by typeName.

예외

assemblyName 또는 typeNamenull인 경우assemblyName or typeName is null.

일치하는 public 생성자를 찾을 수 없습니다.No matching public constructor was found.

assemblyName에서 typename을 찾을 수 없습니다.typename was not found in assemblyName.

assemblyName을 찾을 수 없습니다.assemblyName was not found.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.The caller does not have permission to call this constructor.

호출자가 MarshalByRefObject에서 상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

assemblyName는 유효한 어셈블리가 아닙니다.assemblyName is not a valid assembly.

또는-or- 버전 2.0 이상의 공용 언어 런타임이 현재 로드되어 있으며 assemblyName가 이후 버전으로 컴파일되었습니다.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

어셈블리 또는 모듈이 서로 다른 두 증명 정보로 두 번 로드되었습니다.An assembly or module was loaded twice with two different evidences.

예제

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



설명

CreateInstanceObjectHandle.Unwrap을 결합 하는 편리한 방법입니다.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap. 이 메서드는 typeName에 대해 매개 변수가 없는 생성자를 호출 합니다.This method calls the parameterless constructor for typeName.

assemblyName형식에 대 한 AssemblyName를 참조 하세요.See AssemblyName for the format of assemblyName. typeName형식에 대 한 Type.FullName 속성을 참조 하세요.See the Type.FullName property for the format of typeName.

참고

메서드에 대 한 초기 바인딩 호출을 수행한 M 형식의 개체의 T1 반환한 CreateInstanceAndUnwrap, 메서드 형식의 개체의 메서드에 초기 바인딩된 호출을 수행 하 고 T2 어셈블리에 C 이외의 합니다 현재 어셈블리 또는 포함 된 어셈블리 T1, 어셈블리 C 현재 애플리케이션 도메인에 로드 됩니다.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. 이 로드는 T1.M()에 대 한 초기 바인딩 호출이 DynamicMethod본문 또는 동적으로 생성 된 다른 코드에 생성 된 경우에도 발생 합니다.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. 현재 도메인이 기본 도메인 인 경우 프로세스가 종료 될 때까지 어셈블리 C를 언로드할 수 없습니다.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. 현재 도메인에서 나중에 어셈블리 C를 로드 하려고 하면 로드에 실패할 수 있습니다.If the current domain later attempts to load assembly C, the load might fail.

보안

FileIOPermissionAccess
어셈블리 매니페스트가 포함 된 파일을 읽을 수 있습니다.for the ability to read the file containing the assembly manifest. 연결 된 열거형: ReadAssociated enumeration: Read

WebPermission
어셈블리가 로컬이 아닌 경우 어셈블리의 위치에 액세스할 수 있습니다.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
대리자의 인스턴스를 만들 때 비관리 코드를 호출 하는 기능입니다.for the ability to call unmanaged code when creating an instance of a delegate. 연결 된 열거형: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
모든 형식 멤버에 대 한 작업을 호출 하는 기능입니다.for the ability to invoke operations on all type members. 연결 된 열거형: MemberAccessAssociated enumeration: MemberAccess

추가 정보

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

형식 이름의 대/소문자를 구분할지 여부, 만들 형식을 선택하는 데 사용되는 바인더와 바인딩 특성, 생성자의 인수, 문화권 및 활성화 특성을 지정하여, 지정한 어셈블리에 정의된 지정한 형식의 새 인스턴스를 만듭니다.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

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다.The display name of the assembly. FullName을 참조하세요.See FullName.

typeName
String

네임스페이스만 포함하고 어셈블리는 포함하지 않는 요청된 형식의 정규화된 이름으로, FullName 속성에 의해 반환됩니다.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

검색할 때 대/소문자를 구분할지를 지정하는 부울 값입니다.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

typeName 생성자 검색에 영향을 미치는 0 또는 그 이상의 비트 플래그 조합입니다.A combination of zero or more bit flags that affect the search for the typeName constructor. bindingAttr가 0이면 대/소문자를 구분한 public 생성자 검색이 수행됩니다.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

리플렉션을 통해 바인딩, 인수 형식의 강제 변환, 멤버 호출 및 MemberInfo 개체의 검색을 가능하게 하는 개체입니다.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. binder가 null이면 기본 바인더가 사용됩니다.If binder is null, the default binder is used.

args
Object[]

생성자에 전달할 인수입니다.The arguments to pass to the constructor. 이 인수 배열은 호출할 생성자의 매개 변수와 개수, 순서 및 형식이 일치해야 합니다.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. 매개 변수가 없는 생성자를 사용하려면 args가 빈 배열이거나 null이어야 합니다.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

형식의 강제 변환을 제어하는 데 사용되는 문화권별 개체입니다.A culture-specific object used to govern the coercion of types. culturenull이면 현재 스레드의 CultureInfo가 사용됩니다.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

활성화할 수 있는 하나 이상의 특성으로 이루어진 배열입니다.An array of one or more attributes that can participate in activation. 일반적으로 단일 UrlAttribute 개체가 포함된 배열입니다.Typically, an array that contains a single UrlAttribute object. 원격 개체를 활성화하는 데 필요한 URL을 지정합니다.that specifies the URL that is required to activate a remote object.

이 매개 변수는 클라이언트 활성 개체와 관련되어 있습니다.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. 분산된 애플리케이션은 Windows Communication Foundation을 사용해야 합니다.Distributed applications should instead use Windows Communication Foundation.

반환

typeName에서 지정한 개체의 인스턴스입니다.An instance of the object specified by typeName.

예외

assemblyName 또는 typeNamenull인 경우assemblyName or typeName is null.

일치하는 생성자를 찾을 수 없습니다.No matching constructor was found.

assemblyName에서 typename을 찾을 수 없습니다.typename was not found in assemblyName.

assemblyName을 찾을 수 없습니다.assemblyName was not found.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.The caller does not have permission to call this constructor.

호출자가 MarshalByRefObject에서 상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

assemblyName는 유효한 어셈블리가 아닙니다.assemblyName is not a valid assembly.

또는-or- assemblyName가 현재 로드된 버전보다 이후 버전의 공용 언어 런타임으로 컴파일되었습니다.assemblyName was compiled with a later version of the common language runtime than the version that is currently loaded.

어셈블리 또는 모듈이 서로 다른 두 증명 정보로 두 번 로드되었습니다.An assembly or module was loaded twice with two different evidences.

예제

다음 샘플에서는 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

설명

CreateInstanceObjectHandle.Unwrap을 결합 하는 편리한 방법입니다.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

assemblyName형식에 대 한 AssemblyName를 참조 하세요.See AssemblyName for the format of assemblyName. typeName형식에 대 한 Type.FullName 속성을 참조 하세요.See the Type.FullName property for the format of typeName.

참고

메서드에 대 한 초기 바인딩 호출을 수행한 M 형식의 개체의 T1 반환한 CreateInstanceAndUnwrap, 메서드 형식의 개체의 메서드에 초기 바인딩된 호출을 수행 하 고 T2 어셈블리에 C 이외의 합니다 현재 어셈블리 또는 포함 된 어셈블리 T1, 어셈블리 C 현재 애플리케이션 도메인에 로드 됩니다.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. 이 로드는 T1.M()에 대 한 초기 바인딩 호출이 DynamicMethod본문 또는 동적으로 생성 된 다른 코드에 생성 된 경우에도 발생 합니다.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. 현재 도메인이 기본 도메인 인 경우 프로세스가 종료 될 때까지 어셈블리 C를 언로드할 수 없습니다.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. 현재 도메인에서 나중에 어셈블리 C를 로드 하려고 하면 로드에 실패할 수 있습니다.If the current domain later attempts to load assembly C, the load might fail.

보안

FileIOPermissionAccess
어셈블리 매니페스트가 포함 된 파일을 읽을 수 있습니다.for the ability to read the file containing the assembly manifest. 연결 된 열거형: ReadAssociated enumeration: Read

WebPermission
어셈블리가 로컬이 아닌 경우 어셈블리의 위치에 액세스할 수 있습니다.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
대리자의 인스턴스를 만들 때 비관리 코드를 호출 하는 기능입니다.for the ability to call unmanaged code when creating an instance of a delegate. 연결 된 열거형: UnmanagedCodeAssociated enumeration: UnmanagedCode

ReflectionPermission
모든 형식 멤버에 대 한 작업을 호출 하는 기능입니다.for the ability to invoke operations on all type members. 연결 된 열거형: MemberAccessAssociated enumeration: MemberAccess

추가 정보

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

경고

이 API는 현재 사용되지 않습니다.

지정한 형식의 새 인스턴스를 만듭니다.Creates a new instance of the specified type. 매개 변수에서는 형식의 이름 및 형식을 찾고 만들 수 있는 방법을 지정합니다.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

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다.The display name of the assembly. FullName을 참조하세요.See FullName.

typeName
String

네임스페이스만 포함하고 어셈블리는 포함하지 않는 요청된 형식의 정규화된 이름으로, FullName 속성에 의해 반환됩니다.The fully qualified name of the requested type, including the namespace but not the assembly, as returned by the FullName property.

ignoreCase
Boolean

검색할 때 대/소문자를 구분할지를 지정하는 부울 값입니다.A Boolean value specifying whether to perform a case-sensitive search or not.

bindingAttr
BindingFlags

typeName 생성자 검색에 영향을 미치는 0 또는 그 이상의 비트 플래그 조합입니다.A combination of zero or more bit flags that affect the search for the typeName constructor. bindingAttr가 0이면 대/소문자를 구분한 public 생성자 검색이 수행됩니다.If bindingAttr is zero, a case-sensitive search for public constructors is conducted.

binder
Binder

리플렉션을 통해 바인딩, 인수 형식의 강제 변환, 멤버 호출 및 MemberInfo 개체의 검색을 가능하게 하는 개체입니다.An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects using reflection. binder가 null이면 기본 바인더가 사용됩니다.If binder is null, the default binder is used.

args
Object[]

생성자에 전달할 인수입니다.The arguments to pass to the constructor. 이 인수 배열은 호출할 생성자의 매개 변수와 개수, 순서 및 형식이 일치해야 합니다.This array of arguments must match in number, order, and type the parameters of the constructor to invoke. 매개 변수가 없는 생성자를 사용하려면 args가 빈 배열이거나 null이어야 합니다.If the parameterless constructor is preferred, args must be an empty array or null.

culture
CultureInfo

형식의 강제 변환을 제어하는 데 사용되는 문화권별 개체입니다.A culture-specific object used to govern the coercion of types. culturenull이면 현재 스레드의 CultureInfo가 사용됩니다.If culture is null, the CultureInfo for the current thread is used.

activationAttributes
Object[]

활성화할 수 있는 하나 이상의 특성으로 이루어진 배열입니다.An array of one or more attributes that can participate in activation. 일반적으로, 원격 개체를 활성화하는 데 필요한 URL을 지정하는 단일 UrlAttribute 개체가 포함된 배열입니다.Typically, an array that contains a single UrlAttribute object that specifies the URL that is required to activate a remote object.

이 매개 변수는 클라이언트 활성 개체와 관련되어 있습니다.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. 분산된 애플리케이션은 Windows Communication Foundation을 사용해야 합니다.Distributed applications should instead use Windows Communication Foundation.

securityAttributes
Evidence

typeName의 생성을 인증하는 데 사용하는 정보입니다.Information used to authorize creation of typeName.

반환

typeName에서 지정한 개체의 인스턴스입니다.An instance of the object specified by typeName.

특성

예외

assemblyName 또는 typeNamenull인 경우assemblyName or typeName is null.

일치하는 생성자를 찾을 수 없습니다.No matching constructor was found.

assemblyName에서 typename을 찾을 수 없습니다.typename was not found in assemblyName.

assemblyName을 찾을 수 없습니다.assemblyName was not found.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.The caller does not have permission to call this constructor.

호출자가 MarshalByRefObject에서 상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.The caller cannot provide activation attributes for an object that does not inherit from MarshalByRefObject.

언로드된 애플리케이션 도메인에서 작업이 시도됩니다.The operation is attempted on an unloaded application domain.

assemblyName는 유효한 어셈블리가 아닙니다.assemblyName is not a valid assembly.

또는-or- 버전 2.0 이상의 공용 언어 런타임이 현재 로드되어 있으며 assemblyName가 이후 버전으로 컴파일되었습니다.Version 2.0 or later of the common language runtime is currently loaded and assemblyName was compiled with a later version.

어셈블리 또는 모듈이 서로 다른 두 증명 정보로 두 번 로드되었습니다.An assembly or module was loaded twice with two different evidences.

예제

다음 샘플에서는 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

설명

CreateInstanceObjectHandle.Unwrap을 결합 하는 편리한 방법입니다.This is a convenience method that combines CreateInstance and ObjectHandle.Unwrap.

assemblyName형식에 대 한 AssemblyName를 참조 하세요.See AssemblyName for the format of assemblyName. typeName형식에 대 한 Type.FullName 속성을 참조 하세요.See the Type.FullName property for the format of typeName.

참고

메서드에 대 한 초기 바인딩 호출을 수행한 M 형식의 개체의 T1 반환한 CreateInstanceAndUnwrap, 메서드 형식의 개체의 메서드에 초기 바인딩된 호출을 수행 하 고 T2 어셈블리에 C 이외의 합니다 현재 어셈블리 또는 포함 된 어셈블리 T1, 어셈블리 C 현재 애플리케이션 도메인에 로드 됩니다.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. 이 로드는 T1.M()에 대 한 초기 바인딩 호출이 DynamicMethod본문 또는 동적으로 생성 된 다른 코드에 생성 된 경우에도 발생 합니다.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. 현재 도메인이 기본 도메인 인 경우 프로세스가 종료 될 때까지 어셈블리 C를 언로드할 수 없습니다.If the current domain is the default domain, assembly C cannot be unloaded until the process ends. 현재 도메인에서 나중에 어셈블리 C를 로드 하려고 하면 로드에 실패할 수 있습니다.If the current domain later attempts to load assembly C, the load might fail.

보안

FileIOPermissionAccess
어셈블리 매니페스트가 포함 된 파일을 읽을 수 있습니다.for the ability to read the file containing the assembly manifest. 연결 된 열거형: ReadAssociated enumeration: Read

WebPermission
어셈블리가 로컬이 아닌 경우 어셈블리의 위치에 액세스할 수 있습니다.for the ability to access the location of the assembly if the assembly is not local.

SecurityPermission
증명 정보를 사용 하 여 어셈블리를 로드 합니다.to load an assembly with evidence. 연관된 열거형: ControlEvidenceAssociated enumeration: ControlEvidence.

ReflectionPermission
모든 형식 멤버에 대 한 작업을 호출 하는 기능입니다.for the ability to invoke operations on all type members. 연결 된 열거형: MemberAccessAssociated enumeration: MemberAccess

추가 정보

적용 대상