In mijn zoektocht om een systeem te maken waarbij ik plugins kan gebruiken, had ik het volgende bedacht:
Ik heb een directory met .NET assemblies. Deze bevatten een class, die een bepaalde interface implementeerd.
De interface ziet er als volgt uit:
De class van de plugin ziet er als volgt uit:
Wat ik nu wil is vanuit mijn applicatie, dynamisch de plugin assembly inladen, en deze casten naar de IMonitorPlugin interface.
Dit werkt niet. Ik krijg een InvalidCastException als ik de Instance wil casten naar IMonitorPlugin. Ik heb al heel wat met Reflection rond zitten spelen, maar krijg het niet voor elkaar.
Dus zowel aan de plugin kant, als aan de applicatiekant zijn de IMonitorPlugin interfaces hetzelfde.
Maak ik hier een enorme denkfout?
Ik heb een directory met .NET assemblies. Deze bevatten een class, die een bepaalde interface implementeerd.
De interface ziet er als volgt uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
| using System; using System.Collections.Generic; using System.Text; namespace PimsMonitor { interface IMonitorPlugin { string Action(); } } |
De class van de plugin ziet er als volgt uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| using System; using System.Collections.Generic; using System.Text; namespace PimsMonitor { public class Plugin : IMonitorPlugin { public string Action() { return "Hello World! From TestPlugin!"; } } } |
Wat ik nu wil is vanuit mijn applicatie, dynamisch de plugin assembly inladen, en deze casten naar de IMonitorPlugin interface.
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
| using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace PimsMonitor { class Plugin { Assembly PluginAssembly; IMonitorPlugin PluginObject; string Description; public Plugin(string FilePath) { PluginAssembly = Assembly.LoadFrom(FilePath); CreateInstance(); } public void CreateInstance() { PluginObject = (IMonitorPlugin)PluginAssembly.CreateInstance("PimsMonitor.Plugin"); } } } |
Dit werkt niet. Ik krijg een InvalidCastException als ik de Instance wil casten naar IMonitorPlugin. Ik heb al heel wat met Reflection rond zitten spelen, maar krijg het niet voor elkaar.
Dus zowel aan de plugin kant, als aan de applicatiekant zijn de IMonitorPlugin interfaces hetzelfde.
Maak ik hier een enorme denkfout?