Атрибуты C ++ / CLI - PullRequest
       23

Атрибуты C ++ / CLI

1 голос
/ 10 марта 2012

Я пытаюсь создать пользовательский атрибут, который позволит методу в каждой из моих библиотек пользовательских элементов управления инициализироваться во время выполнения.Мне удалось заставить это работать, используя отражение следующим образом:

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

};

Если я пытаюсь инициализировать метод в другой библиотеке пользовательских элементов управления, он не инициализирует foo2, указанный ниже, не инициализирует:

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

};

Есть идеи?

1 Ответ

1 голос
/ 12 марта 2012

System::AppDomain::CurrentDomain->GetAssemblies() только перечисляет сборки, которые уже загружены. Поскольку .NET выполняет отложенную загрузку, сюда входят все сборки, на которые вы ссылались.

Я предлагаю установить обработчик для события AppDomain::AssemblyLoad и обрабатывать типы в будущих сборках по мере их загрузки.

...