Ладно, чтобы свести вопрос и комментарии вниз, мы пытаемся сделать здесь приложение на C #, которое загружает dll, который был внедрен сторонним разработчиком на более позднем этапе, и приложение должно получить некоторая информация о состоянии от компонента в загруженной dll (факт, что компонент использует WinForms против некоторого другого пользовательского интерфейса, кажется совершенно несущественным).
Лучший способ сделать это - начать с интерфейса или базового класса, который может быть разделен между хост-приложением и загруженным компонентом. Для достижения этого интерфейс должен быть в отдельной DLL. Итак, сначала мы создаем проект библиотеки классов и добавляем следующий класс:
using System;
using System.Windows.Forms;
namespace SimplePluginShared
{
public class PluginBase : Form
{
public virtual String GetStatus()
{
return null;
}
}
}
Затем добавьте ссылку на эту библиотеку классов из проекта, который реализует компонент, который вы загружаете с помощью отражения (или поделитесь им с вашей третьей стороной для их реализации). Вот пример реализации базы плагинов:
using System;
using System.Windows.Forms;
using SimplePluginShared;
namespace SimplePluginExample
{
public partial class MyForm : PluginBase
{
private String _status = "Unspecified";
public MyForm()
{
InitializeComponent();
}
public override string GetStatus()
{
return _status;
}
private void btnGive_Click(Object sender, EventArgs e)
{
_status = "Give Him The Stick.";
this.DialogResult = DialogResult.OK;
this.Close();
}
private void btnDontGive_Click(object sender, EventArgs e)
{
_status = "Don't Give Him The Stick!";
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
}
И, наконец, код для загрузки и вызова компонента:
using System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using SimplePluginShared;
namespace SimplePluginHost
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void btnBrowse_Click(Object sender, EventArgs e)
{
OpenFileDialog openPluginDlg = new OpenFileDialog() { DefaultExt = "dll", Multiselect = false, Title = "Open Plugin DLL", Filter = "DLLs|*.dll" };
if (openPluginDlg.ShowDialog() == DialogResult.OK)
{
txtPluginPath.Text = openPluginDlg.FileName;
}
}
private void btnGo_Click(Object sender, EventArgs e)
{
Assembly pluginDll = Assembly.LoadFrom(txtPluginPath.Text);
Type pluginType = pluginDll.GetTypes().Where(t => typeof(PluginBase).IsAssignableFrom(t)).First();
PluginBase pluginInstance = (PluginBase)Activator.CreateInstance(pluginType);
pluginInstance.ShowDialog();
MessageBox.Show(pluginInstance.GetStatus());
}
}
}
Вот некоторые скриншоты: