Kan man gøre noget for kun at loade dll af bestemt type... det er fordi jeg loader UserControls, men har også et par andre dll filer som den også forsøger at loade, kan jeg ikke tjecke typen inden den loader eller noget i den stil
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
//opretter array af plugins med pladser svarende til antal dllér loadet someUserControls = new UserControl[dllFilenames.Length];
Console.WriteLine(someUserControls.Length+" pladser bled oprettet til dller"); int h = 0; foreach(string filename in dllFilenames) { Console.WriteLine("hej " + filename); try {
//dette skal erstattes af noget langt smartere if (!filename.Equals("C:\\Documents and settings\\JK\\Skrivebord\\Software\\Software\\AMHA\\bin\\Debug\\AMHAPluginInterface.dll")) { Assembly asm = Assembly.LoadFrom(filename); Type [] typesInAssembly = asm.GetTypes(); foreach(Type type in typesInAssembly) {
//opretter fra mange dllér. someUserControls[h] = new UserControl(); try { Console.WriteLine(type.ge); someUserControls[h] = (UserControl)Activator.CreateInstance (type); pluginComboBox.Items.Add(someUserControls[h]); } catch(System.MemberAccessException mae) { Console.WriteLine(mae); } h++; } } } catch(BadImageFormatException e) { // Not a valid assembly, move on } finally {
Jaee vælger dllér på deres navn... dete r noget klyt.... ku ik finde ud af det der regex patern match... evt vil du præcisere .. evt lille stump kode..
sage er med positiv liste, så falder det hele lidt til jorden.... med at kunne smide plugins til dynamisk loadning i dette system.. men evt noget med negatv liste... men den er heller ikke sikker...
det med anden mappe kan jeg ikke få til at virke for der er flere klasser i hvert plugin og de bliver også opfattet som dller ?! mht arne, jooee der da fint... men det er jo også kun på navnet... ik ? men har tænkt på noget helt andet. evt noget med at se efter en bestemt funktion i dll for jeg bruger et interface som hvert plugin skal overholde.... og så kun loade de dll der har netop den funktion fra mit interface....
Hvis dine DLL'er på samme tid kan indeholde klasser som er, og klasser som ikke er plugins, så nytter det ikke noget f.eks. at filtrere på DLL'ernes navne.
I stedet bliver du så nødt til at loade hver DLL og tjekke hver klasse for om den er en plugin eller ej.
En måde at gøre dette på er at indføre et interface; Hvis en given klasse implementere dette interface så er den et plugin. Ved at definere forskellige interfaces kan man så samtidig arbejde med forskellige typer af plugins til samme program.
Normalt placeres dette interface i sin egen DLL:
public interface DitPluginInterface { int EnMetode(int etTal); }
De DLL'er som er beregnet på at implementere plugins skal have en reference til denne interface-DLL, og deres kode kan så typisk se sådan ud:
public class EtPlugin: DitPluginInterface { public int EnMetode(int etTal) { return etTal + 710640; } }
public class IkkeEtPlugin { public int EnMetode(int etTal) { return etTal + 42; } }
Ved at kræve, at dine plugins implementere DitPluginInterface, sikre du dig samtidigt at et plugin altid har implementeret alle de rigtige metoder og felter.
I det program, som skal bruge plugins, starter du med at loade alle DLL'erne fra der hvor de nu er specificeret til at skulle ligge. Derefter tjekker du indholdet for klasser som implementer DitPluginInterface interfacet. Det kunne se sådan ud:
namespace e710640 { class Program { static void Main(string[] args) { List<Type> plugins = new List<Type>();
DirectoryInfo pluginDirectory = new DirectoryInfo(@"C:\Source.Net20\e710640plugin\bin\Debug");
foreach (FileInfo fi in pluginDirectory.GetFiles("*.dll")) { Assembly muligtPlugin = Assembly.LoadFrom(fi.FullName);
foreach (Type type in muligtPlugin.GetTypes()) { Type plugInteface = type.GetInterface("DitPluginInterface"); if (plugInteface != null) plugins.Add(type); } }
foreach (Type plugin in plugins) Console.WriteLine(plugin.ToString()); } } }
OK sry, der er nok ikke nogen der ser på dette mere.. vil nogen svare?, kan end ikke huske hvordan jeg løste det.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.