다음을 통해 공유


AppDomain.CreateInstanceAndUnwrap 메서드

정의

지정된 형식의 새 인스턴스를 만듭니다.

오버로드

CreateInstanceAndUnwrap(String, String)

지정된 형식의 새 인스턴스를 만듭니다. 매개 변수는 형식이 정의된 어셈블리와 형식의 이름을 지정합니다.

CreateInstanceAndUnwrap(String, String, Object[])

지정된 형식의 새 인스턴스를 만듭니다. 매개 변수는 형식이 정의된 어셈블리, 형식 이름 및 활성화 특성 배열을 지정합니다.

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

형식 이름의 대/소문자를 무시할지 여부를 지정하여 지정된 어셈블리에 정의된 지정된 형식의 새 인스턴스를 만듭니다. 바인딩 특성 및 만들 형식을 선택하는 데 사용되는 바인더입니다. 생성자의 인수입니다. 문화권; 및 활성화 특성입니다.

CreateInstanceAndUnwrap(String, String, Boolean, BindingFlags, Binder, Object[], CultureInfo, Object[], Evidence)
사용되지 않음.

지정된 형식의 새 인스턴스를 만듭니다. 매개 변수는 형식의 이름과 형식을 찾아서 만드는 방법을 지정합니다.

CreateInstanceAndUnwrap(String, String)

Source:
AppDomain.cs
Source:
AppDomain.cs
Source:
AppDomain.cs

지정된 형식의 새 인스턴스를 만듭니다. 매개 변수는 형식이 정의된 어셈블리와 형식의 이름을 지정합니다.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName);
public object? CreateInstanceAndUnwrap (string assemblyName, 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

어셈블리의 표시 이름입니다. FullName참조하세요.

typeName
String

FullName 속성에서 반환한 네임스페이스가 아닌 어셈블리를 포함하여 요청된 형식의 정규화된 이름입니다.

반환

typeName지정한 개체의 인스턴스입니다.

예외

assemblyName 또는 typeNamenull.

일치하는 공용 생성자를 찾을 수 없습니다.

assemblyName typeName 찾을 수 없습니다.

assemblyName 찾을 수 없습니다.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.

작업이 언로드된 애플리케이션 도메인에서 시도됩니다.

assemblyName 현재 로드된 런타임에 유효한 어셈블리가 아닙니다.

어셈블리 또는 모듈이 두 개의 서로 다른 증명 정보로 두 번 로드되었습니다.

예제

다음 코드 예제에서는 다른 애플리케이션 도메인에서 코드를 실행하는 가장 간단한 방법을 보여줍니다. 이 예제에서는 MarshalByRefObject상속하는 Worker 클래스를 정의합니다. Worker 클래스는 실행 중인 애플리케이션 도메인의 이름을 표시하는 메서드를 정의합니다. 이 예제에서는 기본 애플리케이션 도메인 및 새 애플리케이션 도메인에 Worker 인스턴스를 만듭니다.

메모

Worker 포함하는 어셈블리는 두 애플리케이션 도메인에 로드되어야 하지만 새 애플리케이션 도메인에만 존재하는 다른 어셈블리를 로드할 수 있습니다.

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 CreateInstanceWorker : MarshalByRefObject
{
    public void PrintDomain()
    {
        Console.WriteLine("Object is executing in AppDomain \"{0}\"",
            AppDomain.CurrentDomain.FriendlyName);
    }
}

class CreateInstanceAndUnwrapSourceSnippet
{
    public static void Main()
    {
        // Create an ordinary instance in the current AppDomain
        CreateInstanceWorker localWorker = new CreateInstanceWorker();
        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");
        CreateInstanceWorker remoteWorker = (CreateInstanceWorker) ad.CreateInstanceAndUnwrap(
            typeof(CreateInstanceWorker).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"
 */
open System
open System.Reflection

type Worker() =
    inherit MarshalByRefObject()
    member _.PrintDomain() =
        printfn $"Object is executing in AppDomain \"{AppDomain.CurrentDomain.FriendlyName}\""

// Create an ordinary instance in the current AppDomain
let localWorker = Worker()
localWorker.PrintDomain()

// Create a new application domain, create an instance
// of Worker in the application domain, and execute code
// there.
let ad = AppDomain.CreateDomain "New domain"
let remoteWorker = 
    ad.CreateInstanceAndUnwrap(typeof<Worker>.Assembly.FullName, "Worker") :?> 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"

설명

CreateInstance ObjectHandle.Unwrap결합하는 편리한 방법입니다. 이 메서드는 typeName매개 변수가 없는 생성자를 호출합니다.

assemblyName형식은 AssemblyName 참조하세요. typeName형식은 Type.FullName 속성을 참조하세요.

메모

CreateInstanceAndUnwrap반환된 형식 T1 개체의 M 메서드를 초기 바인딩된 호출을 수행하고 해당 메서드가 현재 어셈블리 또는 T1포함하는 어셈블리가 아닌 어셈블리 CT2 형식 개체의 메서드를 조기에 호출하면 어셈블리 C 현재 애플리케이션 도메인에 로드됩니다. 이 로드는 T1.M() 대한 초기 바인딩된 호출이 DynamicMethod본문 또는 동적으로 생성된 다른 코드에서 수행된 경우에도 발생합니다. 현재 도메인이 기본 도메인인 경우 프로세스가 끝날 때까지 어셈블리 C 언로드할 수 없습니다. 현재 도메인이 나중에 어셈블리 C로드하려고 하면 로드가 실패할 수 있습니다.

추가 정보

적용 대상

CreateInstanceAndUnwrap(String, String, Object[])

Source:
AppDomain.cs
Source:
AppDomain.cs
Source:
AppDomain.cs

지정된 형식의 새 인스턴스를 만듭니다. 매개 변수는 형식이 정의된 어셈블리, 형식 이름 및 활성화 특성 배열을 지정합니다.

public:
 System::Object ^ CreateInstanceAndUnwrap(System::String ^ assemblyName, System::String ^ typeName, cli::array <System::Object ^> ^ activationAttributes);
public object? CreateInstanceAndUnwrap (string assemblyName, string typeName, 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

어셈블리의 표시 이름입니다. FullName참조하세요.

typeName
String

FullName 속성에서 반환한 네임스페이스가 아닌 어셈블리를 포함하여 요청된 형식의 정규화된 이름입니다.

activationAttributes
Object[]

활성화에 참여할 수 있는 하나 이상의 특성 배열입니다. 일반적으로 원격 개체를 활성화하는 데 필요한 URL을 지정하는 단일 UrlAttribute 개체가 포함된 배열입니다.

이 매개 변수는 클라이언트 활성화 개체와 관련이 있습니다. 클라이언트 활성화는 이전 버전과의 호환성을 위해 유지되지만 새 개발에는 권장되지 않는 레거시 기술입니다. 분산 애플리케이션은 Windows Communication Foundation을 대신 사용해야 합니다.

반환

typeName지정한 개체의 인스턴스입니다.

예외

assemblyName 또는 typeNamenull.

일치하는 공용 생성자를 찾을 수 없습니다.

assemblyName typeName 찾을 수 없습니다.

assemblyName 찾을 수 없습니다.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.

호출자는 MarshalByRefObject상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.

작업이 언로드된 애플리케이션 도메인에서 시도됩니다.

assemblyName 현재 로드된 런타임에 유효한 어셈블리가 아닙니다.

어셈블리 또는 모듈이 두 개의 서로 다른 증명 정보로 두 번 로드되었습니다.

예제

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[] { });
   }
}
open System
open System.IO
open System.Threading
open System.Reflection
open System.Reflection.Emit

let createADynamicAssembly (myNewDomain: byref<AppDomain>) executableNameNoExe =
    let executableName = executableNameNoExe + ".exe"

    let myAsmName = AssemblyName()
    myAsmName.Name <- executableNameNoExe
    myAsmName.CodeBase <- Environment.CurrentDirectory

    let myAsmBuilder = 
        myNewDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave)
    printfn "-- Dynamic Assembly instantiated."

    let myModBuilder = 
        myAsmBuilder.DefineDynamicModule(executableNameNoExe, executableName)

    let myTypeBuilder = 
        myModBuilder.DefineType(executableNameNoExe,
                        TypeAttributes.Public,
                        typeof<MarshalByRefObject>)

    let myFCMethod = 
        myTypeBuilder.DefineMethod("CountLocalFiles",
                        MethodAttributes.Public |||
                        MethodAttributes.Static,
                        null,
                        [||])

    let currentDirGetMI = typeof<Environment>.GetProperty("CurrentDirectory").GetGetMethod()
    let writeLine0objMI = typeof<Console>.GetMethod("WriteLine", [| typeof<string> |])
    let writeLine2objMI = typeof<Console>.GetMethod("WriteLine", [| typeof<string>; typeof<obj>; typeof<obj> |])
    let getFilesMI = typeof<Directory>.GetMethod("GetFiles", [| typeof<string> |])

    myFCMethod.InitLocals <- true

    let myFCIL = myFCMethod.GetILGenerator()

    printfn "-- Generating MSIL method body..."
    let v0 = myFCIL.DeclareLocal typeof<string>
    let v1 = myFCIL.DeclareLocal typeof<int>
    let v2 = myFCIL.DeclareLocal typeof<string>
    let v3 = myFCIL.DeclareLocal typeof<string[]>

    let evalForEachLabel = myFCIL.DefineLabel()
    let 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

    let myType = myTypeBuilder.CreateType()

    myAsmBuilder.SetEntryPoint myFCMethod
    myAsmBuilder.Save executableName
    printfn "-- Method generated, type completed, and assembly saved to disk."

    myType


printf "Enter a name for the file counting assembly: "
let executableNameNoExe = stdin.ReadLine()
let executableName = executableNameNoExe + ".exe"
printfn "---"

let domainDir = Environment.CurrentDirectory

let mutable curDomain = Thread.GetDomain()

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

printfn $"Current Directory: {Environment.CurrentDirectory}"
let mySetupInfo = AppDomainSetup()
mySetupInfo.ApplicationBase <- domainDir
mySetupInfo.ApplicationName <- executableNameNoExe
mySetupInfo.LoaderOptimization <- LoaderOptimization.SingleDomain

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

printfn $"Creating a new AppDomain '{executableNameNoExe}'..."

printfn $"-- Base Directory = '{myDomain.BaseDirectory}'"
printfn $"-- Shadow Copy? = '{myDomain.ShadowCopyFiles}'"

printfn "---"
let myFCType = 
    createADynamicAssembly &curDomain executableNameNoExe

printfn $"Loading '{executableName}' from '{myDomain.BaseDirectory}'..."

let bFlags = 
    BindingFlags.Public ||| BindingFlags.CreateInstance ||| BindingFlags.Instance

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

printfn $"Executing method 'CountLocalFiles' in {myObjInstance}..."

myFCType.InvokeMember("CountLocalFiles", BindingFlags.InvokeMethod, null, myObjInstance, [||])
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

설명

CreateInstance ObjectHandle.Unwrap결합하는 편리한 방법입니다. 이 메서드는 typeName매개 변수가 없는 생성자를 호출합니다.

assemblyName형식은 AssemblyName 참조하세요. typeName형식은 Type.FullName 속성을 참조하세요.

메모

CreateInstanceAndUnwrap반환된 형식 T1 개체의 M 메서드를 초기 바인딩된 호출을 수행하고 해당 메서드가 현재 어셈블리 또는 T1포함하는 어셈블리가 아닌 어셈블리 CT2 형식 개체의 메서드를 조기에 호출하면 어셈블리 C 현재 애플리케이션 도메인에 로드됩니다. 이 로드는 T1.M() 대한 초기 바인딩된 호출이 DynamicMethod본문 또는 동적으로 생성된 다른 코드에서 수행된 경우에도 발생합니다. 현재 도메인이 기본 도메인인 경우 프로세스가 끝날 때까지 어셈블리 C 언로드할 수 없습니다. 현재 도메인이 나중에 어셈블리 C로드하려고 하면 로드가 실패할 수 있습니다.

추가 정보

적용 대상

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

Source:
AppDomain.cs
Source:
AppDomain.cs
Source:
AppDomain.cs

형식 이름의 대/소문자를 무시할지 여부를 지정하여 지정된 어셈블리에 정의된 지정된 형식의 새 인스턴스를 만듭니다. 바인딩 특성 및 만들 형식을 선택하는 데 사용되는 바인더입니다. 생성자의 인수입니다. 문화권; 및 활성화 특성입니다.

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);
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
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object()) As Object

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다. FullName참조하세요.

typeName
String

FullName 속성에서 반환한 네임스페이스가 아닌 어셈블리를 포함하여 요청된 형식의 정규화된 이름입니다.

ignoreCase
Boolean

대/소문자를 구분하는 검색을 수행할지 여부를 지정하는 부울 값입니다.

bindingAttr
BindingFlags

typeName 생성자에 대한 검색에 영향을 주는 0개 이상의 비트 플래그 조합입니다. bindingAttr 0이면 공용 생성자에 대한 대/소문자 구분 검색이 수행됩니다.

binder
Binder

리플렉션을 사용하여 바인딩, 인수 형식 강제 변환, 멤버 호출 및 MemberInfo 개체 검색을 사용하도록 설정하는 개체입니다. binder null이면 기본 바인더가 사용됩니다.

args
Object[]

생성자에 전달할 인수입니다. 이 인수 배열은 호출할 생성자의 매개 변수를 숫자, 순서 및 형식으로 일치시켜야 합니다. 매개 변수가 없는 생성자가 선호되는 경우 args 빈 배열이거나 null이어야 합니다.

culture
CultureInfo

형식의 강제 변환을 제어하는 데 사용되는 문화권별 개체입니다. culture null경우 현재 스레드에 대한 CultureInfo 사용됩니다.

activationAttributes
Object[]

활성화에 참여할 수 있는 하나 이상의 특성 배열입니다. 일반적으로 단일 UrlAttribute 개체를 포함하는 배열입니다. 원격 개체를 활성화하는 데 필요한 URL을 지정하는 입니다.

이 매개 변수는 클라이언트 활성화 개체와 관련이 있습니다. 클라이언트 활성화는 이전 버전과의 호환성을 위해 유지되지만 새 개발에는 권장되지 않는 레거시 기술입니다. 분산 애플리케이션은 Windows Communication Foundation을 대신 사용해야 합니다.

반환

typeName지정한 개체의 인스턴스입니다.

예외

assemblyName 또는 typeNamenull.

일치하는 생성자를 찾을 수 없습니다.

assemblyName typeName 찾을 수 없습니다.

assemblyName 찾을 수 없습니다.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.

호출자는 MarshalByRefObject상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.

작업이 언로드된 애플리케이션 도메인에서 시도됩니다.

assemblyName 현재 로드된 런타임에 유효한 어셈블리가 아닙니다.

어셈블리 또는 모듈이 두 개의 서로 다른 증명 정보로 두 번 로드되었습니다.

예제

다음 샘플에서는 ignoreCase 매개 변수를 사용하는 방법을 보여 줍니다.

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 IgnoreCaseSnippet {

   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);
      }
   }
}
open System
open System.Reflection


let instantiateINT32 ignoreCase =
    try
        let currentDomain = AppDomain.CurrentDomain
        let instance = currentDomain.CreateInstanceAndUnwrap(
            "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "SYSTEM.INT32",
            ignoreCase,
            BindingFlags.Default,
            null,
            null,
            null,
            null,
            null)
        printfn $"{instance.GetType()}"
    with :? TypeLoadException as e ->
        printfn $"{e.Message}"

instantiateINT32 false     // Failed!
instantiateINT32 true      // OK!
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

설명

CreateInstance ObjectHandle.Unwrap결합하는 편리한 방법입니다.

assemblyName형식은 AssemblyName 참조하세요. typeName형식은 Type.FullName 속성을 참조하세요.

메모

CreateInstanceAndUnwrap반환된 형식 T1 개체의 M 메서드를 초기 바인딩된 호출을 수행하고 해당 메서드가 현재 어셈블리 또는 T1포함하는 어셈블리가 아닌 어셈블리 CT2 형식 개체의 메서드를 조기에 호출하면 어셈블리 C 현재 애플리케이션 도메인에 로드됩니다. 이 로드는 T1.M() 대한 초기 바인딩된 호출이 DynamicMethod본문 또는 동적으로 생성된 다른 코드에서 수행된 경우에도 발생합니다. 현재 도메인이 기본 도메인인 경우 프로세스가 끝날 때까지 어셈블리 C 언로드할 수 없습니다. 현재 도메인이 나중에 어셈블리 C로드하려고 하면 로드가 실패할 수 있습니다.

추가 정보

적용 대상

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

주의

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:
 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);
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);
[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
[<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.")>]
member this.CreateInstanceAndUnwrap : string * string * bool * System.Reflection.BindingFlags * System.Reflection.Binder * obj[] * System.Globalization.CultureInfo * obj[] * System.Security.Policy.Evidence -> obj
Public Function CreateInstanceAndUnwrap (assemblyName As String, typeName As String, ignoreCase As Boolean, bindingAttr As BindingFlags, binder As Binder, args As Object(), culture As CultureInfo, activationAttributes As Object(), securityAttributes As Evidence) As Object

매개 변수

assemblyName
String

어셈블리의 표시 이름입니다. FullName참조하세요.

typeName
String

FullName 속성에서 반환한 네임스페이스가 아닌 어셈블리를 포함하여 요청된 형식의 정규화된 이름입니다.

ignoreCase
Boolean

대/소문자를 구분하는 검색을 수행할지 여부를 지정하는 부울 값입니다.

bindingAttr
BindingFlags

typeName 생성자에 대한 검색에 영향을 주는 0개 이상의 비트 플래그 조합입니다. bindingAttr 0이면 공용 생성자에 대한 대/소문자 구분 검색이 수행됩니다.

binder
Binder

리플렉션을 사용하여 바인딩, 인수 형식 강제 변환, 멤버 호출 및 MemberInfo 개체 검색을 사용하도록 설정하는 개체입니다. binder null이면 기본 바인더가 사용됩니다.

args
Object[]

생성자에 전달할 인수입니다. 이 인수 배열은 호출할 생성자의 매개 변수를 숫자, 순서 및 형식으로 일치시켜야 합니다. 매개 변수가 없는 생성자가 선호되는 경우 args 빈 배열이거나 null이어야 합니다.

culture
CultureInfo

형식의 강제 변환을 제어하는 데 사용되는 문화권별 개체입니다. culture null경우 현재 스레드에 대한 CultureInfo 사용됩니다.

activationAttributes
Object[]

활성화에 참여할 수 있는 하나 이상의 특성 배열입니다. 일반적으로 원격 개체를 활성화하는 데 필요한 URL을 지정하는 단일 UrlAttribute 개체가 포함된 배열입니다.

이 매개 변수는 클라이언트 활성화 개체와 관련이 있습니다. 클라이언트 활성화는 이전 버전과의 호환성을 위해 유지되지만 새 개발에는 권장되지 않는 레거시 기술입니다. 분산 애플리케이션은 Windows Communication Foundation을 대신 사용해야 합니다.

securityAttributes
Evidence

typeName만들기 권한을 부여하는 데 사용되는 정보입니다.

반환

typeName지정한 개체의 인스턴스입니다.

특성

예외

assemblyName 또는 typeNamenull.

일치하는 생성자를 찾을 수 없습니다.

assemblyName typeName 찾을 수 없습니다.

assemblyName 찾을 수 없습니다.

호출자에게 이 생성자를 호출할 수 있는 권한이 없습니다.

호출자는 MarshalByRefObject상속되지 않는 개체에 대한 활성화 특성을 제공할 수 없습니다.

작업이 언로드된 애플리케이션 도메인에서 시도됩니다.

assemblyName 현재 로드된 런타임에 유효한 어셈블리가 아닙니다.

어셈블리 또는 모듈이 두 개의 서로 다른 증명 정보로 두 번 로드되었습니다.

예제

다음 샘플에서는 ignoreCase 매개 변수를 사용하는 방법을 보여 줍니다.

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 IgnoreCaseSnippet {

   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);
      }
   }
}
open System
open System.Reflection


let instantiateINT32 ignoreCase =
    try
        let currentDomain = AppDomain.CurrentDomain
        let instance = currentDomain.CreateInstanceAndUnwrap(
            "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
            "SYSTEM.INT32",
            ignoreCase,
            BindingFlags.Default,
            null,
            null,
            null,
            null,
            null)
        printfn $"{instance.GetType()}"
    with :? TypeLoadException as e ->
        printfn $"{e.Message}"

instantiateINT32 false     // Failed!
instantiateINT32 true      // OK!
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

설명

CreateInstance ObjectHandle.Unwrap결합하는 편리한 방법입니다.

assemblyName형식은 AssemblyName 참조하세요. typeName형식은 Type.FullName 속성을 참조하세요.

메모

CreateInstanceAndUnwrap반환된 형식 T1 개체의 M 메서드를 초기 바인딩된 호출을 수행하고 해당 메서드가 현재 어셈블리 또는 T1포함하는 어셈블리가 아닌 어셈블리 CT2 형식 개체의 메서드를 조기에 호출하면 어셈블리 C 현재 애플리케이션 도메인에 로드됩니다. 이 로드는 T1.M() 대한 초기 바인딩된 호출이 DynamicMethod본문 또는 동적으로 생성된 다른 코드에서 수행된 경우에도 발생합니다. 현재 도메인이 기본 도메인인 경우 프로세스가 끝날 때까지 어셈블리 C 언로드할 수 없습니다. 현재 도메인이 나중에 어셈블리 C로드하려고 하면 로드가 실패할 수 있습니다.

추가 정보

적용 대상