Found a solution:
, , MEF. DLL , EXE . , .NET:
Icon MyDLLIcon = Icon.ExtractAssociatedIcon(DLLFilePath);
, MEF, .
, Plug-In , , , - .
:
, 5 (MainProgram, ContractInterfaces, PlugInA, PlugInB, PlugInC)
Post Build DLL "Plug-Ins"
MainProgram (WinForm) DLL- ListView .
ListView Plug-In ( Lazy-) .
, TextBox , , .
Title, Description Version Plug-In
DLL ( Visual Studio 6 Common Graphics Misc)

DLL, ListView, DLL ( Plug-In ListView).
# WinForm "MainProgram" ( VS 2010):
- Code Sample Using, :
- ;
- System.Collections.Generic;
- System.ComponentModel.Composition;
- System.ComponentModel.Composition.Hosting;
- System.Drawing;
- System.IO;
- System.Windows.Forms;
- ContractInterfaces;
- ( ) MainProgram
public partial class Form1 : Form
{
[ImportMany(typeof(IPlugIn))]
private IEnumerable<Lazy<IPlugIn, IPlugInMetadata>> LoadedPlugIns;
List<PlugInInfo> AvailablePlugIns = null;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
AvailablePlugIns = GetPlugInList();
ImageList ImgList = new ImageList();
ImgList.ColorDepth = ColorDepth.Depth32Bit;
ImgList.ImageSize = new Size(32, 32);
foreach (var item in AvailablePlugIns)
{
ImgList.Images.Add(item.PlugInIcon.ToBitmap());
}
listView1.LargeImageList = ImgList;
int imageIndex = 0;
foreach (var item in AvailablePlugIns)
{
listView1.Items.Add(item.PlugInTitle, imageIndex);
imageIndex++;
}
listView1.MouseDoubleClick += new MouseEventHandler(listView1_MouseDoubleClick);
}
void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
int plugInNum = listView1.SelectedItems[0].Index;
PlugInInfo selectedPlugIn = AvailablePlugIns[plugInNum];
selectedPlugIn.PlugIn.StartPlugIn(this);
Console.WriteLine("Plug-In Title: {0}", selectedPlugIn.PlugInTitle);
Console.WriteLine("Plug-In Description: {0}", selectedPlugIn.PlugInDescription);
Console.WriteLine("Plug-In Version: {0}", selectedPlugIn.PlugInVersion);
Console.WriteLine();
}
private List<PlugInInfo> GetPlugInList()
{
List<PlugInInfo> plugInList = new List<PlugInInfo>();
string plugInFolderPath = System.IO.Path.Combine(Application.StartupPath, @"..\..\..\Plug-Ins");
if (!Directory.Exists(plugInFolderPath))
{
try
{ Directory.CreateDirectory(plugInFolderPath); }
catch
{ MessageBox.Show("Failed to create Plug-In folder", "Folder Creation Error:", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }
}
try
{
var catalog = new DirectoryCatalog(plugInFolderPath, "*.dll");
AggregateCatalog plugInCatalog = new AggregateCatalog();
plugInCatalog.Catalogs.Add(catalog);
CompositionContainer container = new CompositionContainer(plugInCatalog);
container.ComposeParts(this);
foreach (var plugin in LoadedPlugIns)
{
PlugInInfo info = new PlugInInfo();
info.PlugInTitle = plugin.Metadata.PlugInTitle;
info.PlugInDescription = plugin.Metadata.PlugInDescription;
info.PlugInVersion = plugin.Metadata.PlugInVersion;
info.PlugIn = plugin.Value;
plugInList.Add(info);
}
int index = 0;
foreach (var filePath in catalog.LoadedFiles)
{
plugInList[index].PlugInIcon = Icon.ExtractAssociatedIcon(filePath);
index++;
}
}
catch (FileNotFoundException fex)
{
Console.WriteLine("File not found exception : " + fex.Message);
}
catch (CompositionException cex)
{
Console.WriteLine("Composition exception : " + cex.Message);
}
catch (DirectoryNotFoundException dex)
{
Console.WriteLine("Directory not found exception : " + dex.Message);
}
return plugInList;
}
}
public class PlugInInfo
{
public string PlugInTitle { get; set; }
public string PlugInDescription { get; set; }
public string PlugInVersion { get; set; }
public Icon PlugInIcon { get; set; }
public IPlugIn PlugIn { get; set; }
}
ListView "listView1" . TextBoxes .
"ContractInterfaces", :
- System.Windows.Forms;
- ( ) ContractInterfaces
public interface IPlugIn
{
void StartPlugIn(Form mainForm);
}
public interface IPlugInMetadata
{
string PlugInTitle { get; }
string PlugInDescription { get; }
string PlugInVersion { get; }
}
"PlugInA", :
- ;
- System.ComponentModel.Composition;
- System.Windows.Forms;
- ContractInterfaces;
- ( ) PlugInA
[Export(typeof(IPlugIn))]
[PluginMetadata]
public class Program : IPlugIn
{
private Form MainForm;
public void StartPlugIn(Form mainForm)
{
MainForm = mainForm;
TextBox textBox = new TextBox();
textBox.Text = "PlugInA";
MainForm.Controls.Add(textBox);
textBox.Width = 65;
textBox.Height = 20;
textBox.Top = 0;
textBox.Left = 0;
}
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
public string PlugInTitle { get; set; }
public string PlugInDescription { get; set; }
public object PlugInVersion { get; set; }
public PluginMetadataAttribute()
: base(typeof(IPlugInMetadata))
{
PlugInTitle = "Plug-In A";
PlugInDescription = "This is Plug-In A";
PlugInVersion = "1.0.0.0";
}
}
"PlugInB", :
- ;
- System.ComponentModel.Composition;
- System.Windows.Forms;
- ContractInterfaces;
- ( ) PlugInB
[Export(typeof(IPlugIn))]
[PluginMetadata]
public class Program : IPlugIn
{
private Form MainForm;
public void StartPlugIn(Form mainForm)
{
MainForm = mainForm;
TextBox textBox = new TextBox();
textBox.Text = "PlugInB";
MainForm.Controls.Add(textBox);
textBox.Width = 65;
textBox.Height = 20;
textBox.Top = 30;
textBox.Left = 0;
}
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
public string PlugInTitle { get; set; }
public string PlugInDescription { get; set; }
public object PlugInVersion { get; set; }
public PluginMetadataAttribute()
: base(typeof(IPlugInMetadata))
{
PlugInTitle = "Plug-In B";
PlugInDescription = "This is Plug-In B";
PlugInVersion = "1.0.0.1";
}
}
"PlugInC", :
- ;
- System.ComponentModel.Composition;
- System.Windows.Forms;
- ContractInterfaces;
- ( ) PlugInC
[Export(typeof(IPlugIn))]
[PluginMetadata]
public class Program : IPlugIn
{
private Form MainForm;
public void StartPlugIn(Form mainForm)
{
MainForm = mainForm;
TextBox textBox = new TextBox();
textBox.Text = "PlugInC";
MainForm.Controls.Add(textBox);
textBox.Width = 65;
textBox.Height = 20;
textBox.Top = 60;
textBox.Left = 0;
}
}
[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
public string PlugInTitle { get; set; }
public string PlugInDescription { get; set; }
public object PlugInVersion { get; set; }
public PluginMetadataAttribute()
: base(typeof(IPlugInMetadata))
{
PlugInTitle = "Plug-In C";
PlugInDescription = "This is Plug-In C";
PlugInVersion = "1.0.0.2";
}
}
:

Solution "Project Dependencies...". :
- MainProgram - - ContractInterface
- PlugInA - - ContractInterface
- PlugInB - - ContractInterface
- PlugInC - - ContractInterface
- ContractInterface - - []
Solution "Project Build Order...". :
- ContractInterface
- PlugInB
- PlugInC
- MainProgram
. 3 DLL, "Plug-Ins" , (*.sln). , , Plug-In. , ListView . ListView, .
, , -...