Freigeben über


ExtensibleClassFactory-Klasse

Ermöglicht das Anpassen verwalteter Objekte, bei denen es sich um eine Erweiterung nicht verwalteter Objekte während der Erstellung handelt.

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

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public NotInheritable Class ExtensibleClassFactory
'Usage
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

Hinweise

ExtensibleClassFactory ermöglicht Benutzern das Angeben eines delegate, der während der Erstellung eines RCW (Runtime Callable Wrapper) aufgerufen wird, der eine Instanz des zugrunde liegenden COM-Objekts bereitstellt. Tatsächlich wirkt der Rückruf als ClassFactory für das COM-Objekt, das vom RCW umfasst wird. Ohne den Rückruf erstellt die Common Language Runtime das zugrunde liegende COM-Objekt durch Aufrufen von CoCreateInstance. Dieser Rückruf stellt eine alternative Möglichkeit zum Aktivieren des zugrunde liegenden Objekts dar, z. B. mit einem COM-Moniker oder durch Bereitstellen eines Singletonobjekts. Die RegisterObjectCreationCallback-Methode muss in der static-Initialisierung der Klasse aufgerufen werden, die den RCW erweitert. Pro Objekttyp ist nur ein Rückruf bei der Objekterstellung zulässig. Wenn der erweiterbare RCW aktiviert ist, wird der Rückruf registriert. Wenn das zugrunde liegende COM-Objekt erstellt werden muss, wird der Rückruf aufgerufen, um einen Verweis auf das Objekt bereitzustellen. Der Rückruf muss einen IUnknown-Schnittstellenzeiger für das Basisobjekt zurückgeben.

Beispiel

Registriert einen delegate, der immer dann aufgerufen wird, wenn eine Instanz eines verwalteten Typs, der aus einem nicht verwalteten Typ erweitert wurde, das aggregierte, nicht verwaltete Objekt reservieren soll. Dieser delegate soll das nicht verwaltete Objekt reservieren und aggregieren und wird anstelle einer CoCreateInstance aufgerufen. Diese Routine muss im Kontext der static-Initialisierung für die Klasse aufgerufen werden, für die die Rückrufe durchgeführt werden.

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

Vererbungshierarchie

System.Object
  System.Runtime.InteropServices.ExtensibleClassFactory

Threadsicherheit

Alle öffentlichen statischen (Shared in Visual Basic) Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Plattformen

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 unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

Siehe auch

Referenz

ExtensibleClassFactory-Member
System.Runtime.InteropServices-Namespace