Witam, korzystam z Managed Extensibility Framework - w skórcie MEF, do tworzenia mechanizmu pluginów.
Tak więc mam okno główne - rodzica. Rodzic jest kontenerem dla okien MDI, tak więc IsMdiContainer = True.
Następnie, w nowym projekcie stworzyłem sobie formę, położyłem button, podpiąłem MessageBox i skompilowałem jako DLL.
Wszystko fajnie, jednak nie wiem jak utworzyć interfejs, lub w ogóle sprawić, żeby po kliknięciu na button (w oknie głównym) została otworzona forma, która obecne znajduje się w DLL'ce :/
Btw. jestem początkujący w MEF
Dodam jeszcze, że w prezencie, przy próbie kompilacji formy w DLL dostaję :
Error 1 'MEF_Form.Form1' does not implement interface member 'MEF_Interfejs.IMessageSender.Send(string)' D:\Projekty\MEF\MEF_Form\MEF_Form\Form1.cs 15 26 MEF_Form
Źródła
Program główny
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using MEF_Interfejs;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new MefGospodarz().Run();
}
}
class MefGospodarz
{
[Import]
public IMessageSender MessageSender { get; set; }
private void Compose()
{
AggregateCatalog katalog = new AggregateCatalog();
katalog.Catalogs.Add(new DirectoryCatalog(@".\wtyczki"));
if (katalog.Parts.Count() > 0)
{
//wyswietlenie wtyczek
var kolekcja = katalog.Parts;
string s = "Znalezione wtyczki : \n";
foreach (var element in kolekcja)
s += element.ToString() + "\n";
MessageBox.Show(s);
CompositionContainer pojemnik = new CompositionContainer(katalog);
pojemnik.ComposeParts(this);
}
}
public void Run()
{
Compose();
// if (MessageSender != null)
// {
// if (!MessageSender.Send("Treść wiadomości"))
// MessageBox.Show("Nie udało się dostarczyć wiadomości");
// }
// else MessageBox.Show("Brak wtyczki pozwalającej na dostarczenie wiadomości");
}
}
}
Interfejs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MEF_Interfejs
{
public interface IMessageSender
{
bool Send(string message);
// ?? Form pp = new Form();
}
}
Forma w DLL
using System.Windows.Forms;
using System.ComponentModel.Composition;
using MEF_Interfejs;
namespace MEF_Form
{
[Export(typeof(IMessageSender))]
public partial class Form1 : Form, IMessageSender
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("DUPA BLADA");
}
}
}