2012-03-10 11 views
0

私のカスタムコントロールライブラリの各メソッドを実行時に初期化できるカスタム属性を作成しようとしています。私は、これは次のようにリフレクションを使用して仕事を得るために管理している:C++/CLIの属性

InitOnload::initialise() 
{ 
    // get a list of types which are marked with the InitOnLoad attribute 
    array<System::Reflection::Assembly^>^ assemblies = System::AppDomain::CurrentDomain->GetAssemblies(); 

    for each(System::Reflection::Assembly^ assembly in assemblies) 
    { 
     try 
     { 
       System::Type^ type = System::Type::GetType("INITONLOAD.InitOnload"); 

       array<Object^>^ attributes = assembly->GetCustomAttributes(type, false); 

      if(attributes->Length > 0) 
      { 
       auto field = 
       type->GetFields(
       System::Reflection::BindingFlags::Static | 
       System::Reflection::BindingFlags::Public | 
       System::Reflection::BindingFlags::NonPublic); 
      } 
      } 
     catch (...) 
     { 
     } 
     } 
} 

foo2は、起動時に初期化されますが、それは上記InitOnloadと同じ名前空間で定義されている場合のみ。

[assembly: InitOnload()]; 
public ref class foo2 : public System::Attribute 
{ 
public: 
    foo2() 
    { 
    }; 

}; 

私は別のカスタムコントロールライブラリのメソッドをinitilaiseしようとした場合、それはinitilaliseしません下記foo2はinitilaiseしません:

[assembly: INITONLOAD::InitOnload()]; 
public ref class foo : public System::Attribute 
{ 
public: 
    foo() 
    { 
    }; 

}; 

任意のアイデア?

+2

誰かが最初にアセンブリをロードする必要があります。 –

答えて

1

System::AppDomain::CurrentDomain->GetAssemblies()は、すでにロードされているアセンブリのみをリストします。 .NETは遅延読み込みを実行するため、参照したすべてのアセンブリが含まれます。

AppDomain::AssemblyLoadイベントのハンドラーをインストールし、将来のアセンブリがロードされるときにそのタイプを処理することをお勧めします。