次の方法で共有


ExtensibleClassFactory クラス

アンマネージ オブジェクトから拡張したマネージ オブジェクトの作成時に、そのオブジェクトをカスタマイズできるようにします。

この型のすべてのメンバの一覧については、ExtensibleClassFactory メンバ を参照してください。

System.Object
   System.Runtime.InteropServices.ExtensibleClassFactory

NotInheritable Public Class ExtensibleClassFactory
[C#]
public sealed class ExtensibleClassFactory
[C++]
public __gc __sealed class ExtensibleClassFactory
[JScript]
public class ExtensibleClassFactory

スレッドセーフ

この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。

解説

ExtensibleClassFactory を使用すると、ランタイム呼び出し可能ラッパーの構築時に呼び出され、その中にラップされる COM オブジェクトのインスタンスを提供する delegate を指定できます。実際、このコールバックは、ランタイム呼び出し可能ラッパーによってラップされる COM オブジェクトのクラス ファクトリとして機能します。このコールバックがない場合、共通言語ランタイムは、 CoCreateInstance を呼び出して、ラップされる COM オブジェクトを作成します。このコールバックは、COM モニカの使用、シングルトン オブジェクトの提供など、ラップされるオブジェクトをアクティブにするための方法の代わりとなる役割を果たします。 RegisterObjectCreationCallback メソッドは、ランタイム呼び出し可能ラッパーを拡張しているクラスの静的 (Visual Basic では Shared) 初期化子で呼び出す必要があります。1 つのオブジェクト型で使用できるオブジェクト作成コールバックは 1 つだけです。拡張できるランタイム呼び出し可能ラッパーをアクティブにしたときに、そのコールバックが登録されます。ラップされる COM オブジェクトを作成する必要がある場合は、そのオブジェクトへの参照を取得するためにコールバックが呼び出されます。コールバックは、基本オブジェクトの IUnknown インターフェイス ポインタを返す必要があります。

使用例

[Visual Basic, C#, C++] アンマネージ型から拡張したマネージ型のインスタンスが、アグリゲートされたアンマネージ オブジェクトを割り当てる必要がある場合に、必ず呼び出されるデリゲートを登録します。この delegate は、 CoCreateInstance の代わりに呼び出され、アンマネージ オブジェクトを割り当ててアグリゲートする必要があります。このルーチンは、コールバックが行われる対象のクラスの静的 (Visual Basic では Shared) 初期化子のコンテキストで呼び出す必要があります。

 
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

[C#] 
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();
   }
}

[C++] 
public __gc class CallBack
{
public:
   IntPtr Activate(IntPtr Aggregator)
   {
      ECFSRV32Lib::ObjectActivator* oCOM = new 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 __gc class EcfInner : public ECFSRV32Lib::BaseComponent
{
   static CallBack* callbackInner;

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

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

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

名前空間: System.Runtime.InteropServices

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

ExtensibleClassFactory メンバ | System.Runtime.InteropServices 名前空間