다음을 통해 공유


ExtensibleClassFactory 클래스

만드는 동안 관리되지 않는 개체에서 확장되는 관리되는 개체를 사용자 지정할 수 있습니다.

네임스페이스: System.Runtime.InteropServices
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<ComVisibleAttribute(True)> _
Public NotInheritable Class ExtensibleClassFactory
‘사용 방법
Dim instance As ExtensibleClassFactory
[ComVisibleAttribute(true)] 
public sealed class ExtensibleClassFactory
[ComVisibleAttribute(true)] 
public ref class ExtensibleClassFactory sealed
/** @attribute ComVisibleAttribute(true) */ 
public final class ExtensibleClassFactory
ComVisibleAttribute(true) 
public final class ExtensibleClassFactory

설명

ExtensibleClassFactory를 사용하면 내부 COM 개체의 인스턴스를 제공하는 RCW(런타임 호출 가능 래퍼)를 생성하는 동안 호출되는 delegate를 지정할 수 있습니다. 실제로, 콜백은 RCW에 의해 래핑된 COM 개체에 대한 클래스 팩터리로 작용합니다. 콜백을 사용하지 않으면 공용 언어 런타임은 CoCreateInstance를 호출하여 내부 COM 개체를 만듭니다. 이러한 콜백은 COM 모니커를 사용하거나 singleton 개체를 제공하여 내부 개체를 활성화할 수 있는 다른 방법을 제공합니다. RegisterObjectCreationCallback 메서드는 RCW를 확장하는 클래스의 static 이니셜라이저에서 호출되어야 합니다. 개체 형식마다 하나의 개체 작성 콜백만 허용됩니다. 확장 가능한 RCW가 활성화되면 콜백이 등록됩니다. 내부 COM 개체를 만들어야 할 경우 개체에 대한 참조를 제공하도록 해당 콜백이 호출됩니다. 콜백은 개본 개체에 대해 IUnknown 인터페이스 포인터를 반환해야 합니다.

예제

관리되지 않는 형식에서 확장된 관리되는 형식의 인스턴스가 집계된 관리되지 않는 개체를 할당해야 할 때마다 호출될 delegate를 등록합니다. 이 delegate는 관리되지 않는 개체를 할당하고 집계하게 되며, CoCreateInstance 대신 호출됩니다. 이 루틴은 콜백이 수행될 클래스의 static 이니셜라이저 컨텍스트에서 호출되어야 합니다.

Imports System
Imports System.Runtime.InteropServices

Public Class CallBack
    
    Public Function Activate(Aggregator As IntPtr) As IntPtr
        Dim oCOM As New ECFSRV32Lib.ObjectActivator()
        Dim itf As ECFSRV32Lib.IObjectActivator = _
           CType(oCOM, ECFSRV32Lib.IObjectActivator)
        Return New IntPtr(itf.CreateBaseComponent(Aggregator.ToInt32()))
    End Function
End Class

'
' The EcfInner class. First .NET class derived directly from COM class.
'
Public Class EcfInner
    Inherits ECFSRV32Lib.BaseComponent
    Private Shared callbackInner As CallBack    
    
    Shared Sub RegisterInner()
        callbackInner = New CallBack()
        ExtensibleClassFactory.RegisterObjectCreationCallback( _
           New System.Runtime.InteropServices.ObjectCreationDelegate( _
           AddressOf callbackInner.Activate))
    End Sub    
    
    'This is the static initializer.    
    Shared Sub New()
        RegisterInner()
    End Sub
End Class
using System;
using System.Runtime.InteropServices;

public class CallBack
{
   public IntPtr Activate(IntPtr Aggregator)
   {
      ECFSRV32Lib.ObjectActivator oCOM = new ECFSRV32Lib.ObjectActivator();
      ECFSRV32Lib.IObjectActivator itf = (ECFSRV32Lib.IObjectActivator)oCOM;
      return (IntPtr) itf.CreateBaseComponent((int)Aggregator);
   }
}

//
// The EcfInner class. First .NET class derived directly from COM class.
//
public class EcfInner : ECFSRV32Lib.BaseComponent
{
   static CallBack callbackInner;

   static void RegisterInner()
   {      
      callbackInner = new CallBack();
      System.Runtime.InteropServices.ExtensibleClassFactory.RegisterObjectCreationCallback(new System.Runtime.InteropServices.ObjectCreationDelegate(callbackInner.Activate));
   }

   //This is the static initializer.    
   static EcfInner()
   {
      RegisterInner();
   }
}
public ref class CallBack
{
public:
   IntPtr Activate( IntPtr Aggregator )
   {
      ECFSRV32Lib::ObjectActivator^ oCOM = gcnew ECFSRV32Lib::ObjectActivator;
      ECFSRV32Lib::IObjectActivator^ itf = dynamic_cast<ECFSRV32Lib::IObjectActivator^>(oCOM);
      return (IntPtr)itf->CreateBaseComponent( (int)Aggregator );
   }
};

//
// The EcfInner class. First .NET class derived directly from COM class.
//
public ref class EcfInner: public ECFSRV32Lib::BaseComponent
{
private:
   static CallBack^ callbackInner;
   static void RegisterInner()
   {
      callbackInner = gcnew CallBack;
      System::Runtime::InteropServices::ExtensibleClassFactory::RegisterObjectCreationCallback( gcnew System::Runtime::InteropServices::ObjectCreationDelegate( callbackInner, &CallBack::Activate ) );
   }

   //This is the static initializer.    
   static EcfInner()
   {
      RegisterInner();
   }
};
package ECFSRV32Lib;

import System.*;
import System.Runtime.InteropServices.*;

public class CallBack
{
    public IntPtr Activate(IntPtr Aggregator)
    {
        ECFSRV32Lib.ObjectActivator oCOM = new ECFSRV32Lib.ObjectActivator();
        ECFSRV32Lib.IObjectActivator iTf= (ECFSRV32Lib.IObjectActivator)(oCOM);
        return (new IntPtr(iTf.CreateBaseComponent((Aggregator).ToInt32())));
    } //Activate
} //CallBack

//
// The EcfInner class. First .NET class derived directly from COM class.
//
public class EcfInner extends ECFSRV32Lib.BaseComponent
{
    private static CallBack callbackInner;

    static void RegisterInner()
    {
        callbackInner = new CallBack();
        System.Runtime.InteropServices.ExtensibleClassFactory.
            RegisterObjectCreationCallback(new System.Runtime.
            InteropServices.ObjectCreationDelegate(callbackInner.Activate));
    } //RegisterInner
    
   //This is the static initializer.    
    static 
    {
        RegisterInner();
    } //EcfInner
} //EcfInner

상속 계층 구조

System.Object
  System.Runtime.InteropServices.ExtensibleClassFactory

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

참고 항목

참조

ExtensibleClassFactory 멤버
System.Runtime.InteropServices 네임스페이스