Program med egne plugins
Jeg fortsætter med at kode mit program der skal kunne loade egne plugins og bruge disse. Planen er at der kommer til at eksistere et bibliotek under systemet der hedder plugins denne indeholder så alle mine dll'er. Jeg har nu følgende spørgsmål: Når jeg definerer et interface i mit system, så lavede den første gang jeg compilerede en interface.dll fil denne har jeg så fjernet men den bliver aldrig genereret igen, hvad sker der? Når jeg laver andre plugins der implementerer dette interface og smider dem i det dertil indrettede directory så kan jeg godt se dem og hente deres navn loade dem og hente deres type. Når jeg prøver at caste dem til mit interface så får jeg en cast exception, også selvom de ser ud til at indeholde samme interface. Kan dette problem have noget med det foregående at gøre. I bund og grund vil jeg bare gerne kunne bruge de metoder jeg finder i mine loadede dll'er. Eventuelt smide dem i en ArrayList til senere brug, hvordan gør man nemmest det, er det så en ArrayList af Type eller hva? Nedenstående er min kode:Metode til at loade:
public void LoadTypes()
{
ArrayList types=new ArrayList();
string currentDirectory = System.IO.Directory.GetCurrentDirectory();
string [] dllFilenames = System.IO.Directory.GetFiles(currentDirectory, "*.dll");
foreach(string filename in dllFilenames)
{
try
{
Assembly asm = Assembly.LoadFrom(filename);
Type [] typesInAssembly = asm.GetTypes();
foreach(Type type in typesInAssembly)
{
if(null != type.GetInterface(typeof(PlugIn2.IPlugin).FullName))
{
// We found a type, load it
Console.WriteLine(string.Format("Assembly: {0} has a type {1} that " +
"implements IPlugIn",
asm.FullName, type.FullName));
Console.WriteLine("Dette er typen "+type.FullName);
PlugIn2.IPlugin myPlugin=(PlugIn2.IPlugin)Activator.
// types.Add(type);
}
}
}
catch(BadImageFormatException e)
{
// Not a valid assembly, move on
}
}
Mit interface:
using System;
namespace PlugIn2
{
/// <summary>
/// Generic plugin interface
/// </summary>
public interface IPlugin
{
string getName();
string getDescription();
}
}
Mit plugin:
using System;
using PlugIn2;
namespace DynamicFourth
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class PlugInFire : PlugIn2.IPlugin
{
private string m_strName;
public PlugInFire()
{
m_strName = "hello I'm " + ToString();
}
public string getName()
{
return "test4";
}
public string getDescription()
{
return "description4";
}
}
}
