Compartilhar via


Classe ExtensibleClassFactory

 

Dica

The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

Permite a personalização de objetos gerenciados que se estendem de objetos não gerenciados durante a criação.

Namespace:   System.Runtime.InteropServices
Assembly:  mscorlib (em mscorlib.dll)

Hierarquia de Herança

System.Object
  System.Runtime.InteropServices.ExtensibleClassFactory

Sintaxe

[ComVisibleAttribute(true)]
public sealed class ExtensibleClassFactory
[ComVisibleAttribute(true)]
public ref class ExtensibleClassFactory sealed 
[<Sealed>]
[<ComVisibleAttribute(true)>]
type ExtensibleClassFactory = class end
<ComVisibleAttribute(True)>
Public NotInheritable Class ExtensibleClassFactory

Métodos

Nome Descrição
System_CAPS_pubmethod Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.(Herdado de Object.)

System_CAPS_pubmethod GetHashCode()

Serve como a função de hash padrão.(Herdado de Object.)

System_CAPS_pubmethod GetType()

Obtém o Type da instância atual.(Herdado de Object.)

System_CAPS_pubmethodSystem_CAPS_static RegisterObjectCreationCallback(ObjectCreationDelegate)

Registra um delegate que é chamado quando uma instância de um tipo gerenciado, que se estende de um tipo não gerenciado, precisa alocar o objeto não gerenciado agregado.

System_CAPS_pubmethod ToString()

Retorna uma cadeia de caracteres que representa o objeto atual.(Herdado de Object.)

Comentários

O ExtensibleClassFactory permite que os usuários especifiquem um delegate que é chamado durante a construção de um RCW runtime callable wrapper () que fornece uma instância do objeto COM subjacente. Na verdade, o retorno de chamada atua como a fábrica de classes para o objeto COM encapsulados pelo RCW. Sem retorno de chamada, o common language runtime cria o objeto de COM subjacentes chamando CoCreateInstance. Esse retorno de chamada fornece uma maneira alternativa de ativação de objeto subjacente, como com um moniker COM ou fornecendo um objeto de singleton. O RegisterObjectCreationCallback método deve ser chamado de static inicializador da classe que está estendendo o RCW. Retorno de chamada de criação de apenas um objeto é permitido por tipo de objeto. Quando o RCW extensível é ativado, o retorno de chamada está registrado. Quando o objeto COM base precisa ser criado, o retorno de chamada é chamado para fornecer uma referência ao objeto. O retorno de chamada deve retornar um IUnknown ponteiro de interface para o objeto base.

Exemplos

Registra um delegate que será chamado sempre que uma instância de um tipo gerenciado que se estende de um tipo não gerenciado precisa alocar o objeto não gerenciado agregado. Isso delegate deve alocar e agregar o objeto não gerenciado e é chamado no lugar de um CoCreateInstance. Esta rotina deve ser chamada no contexto da static inicializador para a classe para a qual os retornos de chamada serão feitos.

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();
   }
}
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
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();
   }
};

Informações de Versão

.NET Framework
Disponível desde 1.1

Acesso thread-safe

Quaisquer membros estáticos públicos ( Compartilhado no Visual Basic) desse tipo são thread-safe. Não há garantia de que qualquer membro de instância seja thread-safe.

Confira Também

Namespace System.Runtime.InteropServices

Retornar ao início