ExtensibleClassFactoryとは? わかりやすく解説

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

使用例使用例

アンマネージ型から拡張したマネージ型のインスタンスが、アグリゲートされたアンマネージ オブジェクトを割り当てる必要がある場合に、必ず呼び出されるデリゲートを登録します。この 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) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
ExtensibleClassFactory メンバ
System.Runtime.InteropServices 名前空間

ExtensibleClassFactory メソッド


ExtensibleClassFactory メンバ




英和和英テキスト翻訳

英語⇒日本語日本語⇒英語

辞書ショートカット

すべての辞書の索引

「ExtensibleClassFactory」の関連用語

ExtensibleClassFactoryのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ExtensibleClassFactoryのページの著作権

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2026 Microsoft.All rights reserved.

©2026 GRAS Group, Inc.RSS