Aracılığıyla paylaş


Nasıl yapılır: bir eklenti bileşeni mimarisini kullanarak yansıma (C++/ CLI)

Aşağıdaki kod örnekleri basit "eklenti" mimarisi uygulamada yansıma kullanımını gösterir.İlk liste uygulamadır, ikincisi ise eklentidir.Uygulama, komut satırı bağımsız değişkeni olarak sağlanan eklenti DLL'inde bulunan form tabanlı sınıflardan herhangi birini kullanarak kendi dolduran çoklu belge formudur.

Uygulama Assembly.Load yöntemini kullanarak sağlanan derlemeyi yüklemeye çalışır.Başarılı olursa, derleme içindeki türler Assembly.GetTypes yöntemi kullanılarak numaralandırılır.Daha sonra her tür Type.IsAssignableFrom yöntemi kullanılarak uyumluluk için denetlenir.Bu örnekte, sağlanan derlemede bulunan sınıflar eklenti olabilmek için Form sınıfından türetilmelidirler.

Uyumlu sınıfların, Type'ı bağımsız değişken olarak kabul eden ve yeni örneğe işaretçi döndüren Activator.CreateInstance yöntemiyle örnekleri oluşturulur.Her yeni örnek daha sonra forma eklenir ve görüntülenir.

Load yönteminin dosya uzantısı içeren derleme isimlerini kabul etmediğini unutmayınız.Uygulamadaki main işlevi sağlanan uzantıları kırpar, böylece aşağıdaki kod iki durumda da çalışır.

Örnek

Aşağıdaki kod, eklentileri kabul eden uygulama tanımlar.İlk bağımsız değişken olarak bir derleme ismi sağlanmalıdır.Bu derleme en az bir tane ortak Form türetilmiş tür içermelidir.

// plugin_application.cpp
// compile with: /clr /c
#using <system.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>

using namespace System;
using namespace System::Windows::Forms;
using namespace System::Reflection;

ref class PluggableForm : public Form  {
public:
   PluggableForm() {}
   PluggableForm(Assembly^ plugAssembly) {
      Text = "plug-in example";
      Size = Drawing::Size(400, 400);
      IsMdiContainer = true;

      array<Type^>^ types = plugAssembly->GetTypes( );
      Type^ formType = Form::typeid;

      for (int i = 0 ; i < types->Length ; i++) {
         if (formType->IsAssignableFrom(types[i])) {
            // Create an instance given the type description.
            Form^ f = dynamic_cast<Form^> (Activator::CreateInstance(types[i]));
            if (f) {
               f->Text = types[i]->ToString();
               f->MdiParent = this;
               f->Show();
            }
         }
      }
   }
};

int main() {
   Assembly^ a = Assembly::LoadFrom("plugin_application.exe");
   Application::Run(gcnew PluggableForm(a));
}

Aşağıdaki kod Form'dan türetilen üç sınıf tanımlar.Sonuçlanan derleme isminin adı önceki listedeki çalıştırılabilire geçirildiğinde, bu üç sınıfın her biri, derleme zamanında konak uygulama tarafından bilinmiyor olmasına rağmen, bulunur ve örnekleri oluşturulur.

// plugin_assembly.cpp
// compile with: /clr /LD
#using <system.dll>
#using <system.drawing.dll>
#using <system.windows.forms.dll>

using namespace System;
using namespace System::Windows::Forms;
using namespace System::Reflection;
using namespace System::Drawing;

public ref class BlueForm : public Form {
public:
   BlueForm() {
      BackColor = Color::Blue;
   }
};

public ref class CircleForm : public Form {
protected:
   virtual void OnPaint(PaintEventArgs^ args) override {
      args->Graphics->FillEllipse(Brushes::Green, ClientRectangle);
   }
};

public ref class StarburstForm : public Form {
public:
   StarburstForm(){
      BackColor = Color::Black;
   }
protected:
   virtual void OnPaint(PaintEventArgs^ args) override {
      Pen^ p = gcnew Pen(Color::Red, 2);
      Random^ r = gcnew Random( );
      Int32 w = ClientSize.Width;
      Int32 h = ClientSize.Height;
      for (int i=0; i<100; i++) {
         float x1 = w / 2;
         float y1 = h / 2;
         float x2 = r->Next(w);
         float y2 = r->Next(h);
         args->Graphics->DrawLine(p, x1, y1, x2, y2);
      }
   }
};

Ayrıca bkz.

Başvuru

Yansıtma (C++/ CLI)