Hallo tweakers!
Ik ben een applicatie aan het maken dat dynamisch een of meerdere assemblies moet kunnen includen, dit doe ik dmv reflection. Het idee erachter is een soort van plugin systeem.
Omdat het een plugin systeem is wil ik om zeker te zijn een interface hebben op de classes in de dll files. Het interface heb ik in een apparte assembly opgeslagen en die voeg ik als reference toe bij het maken van een plugin assembly.
Mijn interface:
Die gebruik ik zo op mijn plugin:
De plugin bestanden sla ik vervolgens op in een "/plugin" directory van de applicatie. In de applicatie zelf lees ik dus vervolgens de plugin directory op alle .dll bestanden. Als ik deze allemaal gevonden heb ga ik de array uitlezen en met reflection:
Als ik nu de "windows" class ga lezen vind hij hem perfect en ook alle methods die de class heeft. Maar hij loopt vast bij if (curType.GetInterface("plugin", true) == null) terwijl de class wel degelijk de plugin interface gebruikt.
Ik ben hier nu al 2 dagen mee aan het stoeien maar het wil maar niet lukken
. Kan iemand mij hier mee helpen? Alvast bedankt!
Ik ben een applicatie aan het maken dat dynamisch een of meerdere assemblies moet kunnen includen, dit doe ik dmv reflection. Het idee erachter is een soort van plugin systeem.
Omdat het een plugin systeem is wil ik om zeker te zijn een interface hebben op de classes in de dll files. Het interface heb ik in een apparte assembly opgeslagen en die voeg ik als reference toe bij het maken van een plugin assembly.
Mijn interface:
C#:
1
2
3
4
5
6
7
8
9
10
11
| namespace proxyPlugin { public interface plugin { string getName(); string getVersion(); bool enableProxy(); bool disableProxy(); bool setProxy(string host, int port); } } |
Die gebruik ik zo op mijn plugin:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| using proxyPlugin; namespace windows { public class windows : plugin { public string getName() { //.. } public string getVersion() { //.. } public bool enableProxy() { //.. } public bool disableProxy() { //.. } public bool setProxy(string host, int port) { //.. } } |
De plugin bestanden sla ik vervolgens op in een "/plugin" directory van de applicatie. In de applicatie zelf lees ik dus vervolgens de plugin directory op alle .dll bestanden. Als ik deze allemaal gevonden heb ga ik de array uitlezen en met reflection:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| // Laad class van de plugin dmv reflection Assembly pluginAsm = Assembly.LoadFrom(pluginInfo.FullName); Type[] asmtypes = pluginAsm.GetTypes(); foreach(Type curType in asmtypes) { if (curType.IsClass && curType.IsPublic) { if (curType.GetInterface("plugin", true) == null) { continue; } MethodInfo[] methods = curType.GetMethods(); foreach (MethodInfo method in methods) { MessageBox.Show(method.ToString()); } } } |
Als ik nu de "windows" class ga lezen vind hij hem perfect en ook alle methods die de class heeft. Maar hij loopt vast bij if (curType.GetInterface("plugin", true) == null) terwijl de class wel degelijk de plugin interface gebruikt.
Ik ben hier nu al 2 dagen mee aan het stoeien maar het wil maar niet lukken