Hiho,
ich bin wiedermal an einem Punkt angelangt, andem ich nicht weiterkomme.
Ich versuche mich gerade an Plugins in C#. Das klappt auch ganz gut:
[cs]
Assembly assembly = Assembly.LoadFrom("Plugin.dll");
foreach (Type type in assembly.GetTypes())
{
Type typeInterface = type.GetInterface("PluginTest.IPlugin", true);
if (typeInterface != null)
{
IPlugin plugin = (IPlugin)Activator.CreateInstance(type);
plugin.SayHello();
break;
}
}
[/cs]
[cs] public interface IPlugin
{
void SayHello();
}[/cs]
[cs] public class Class1 : PluginTest.IPlugin
{
public void SayHello()
{
System.Windows.Forms.MessageBox.Show("Hello");
}
}[/cs]
Nun möchte ich aber gerne Plugins zur Laufzeit nicht nur laden sondern auch entladen können. Geladene Assemblys werden erst entladen, wenn die gesammte AppDomain entladen wird.
Also dachte ich mir: Jedes Plugin in eine eigene AppDomain. Das klappt ebenfalls alles ganz gut.
[cs]AppDomain appDomain = AppDomain.CreateDomain("Plugin 1");
appDomain.DoCallBack(new CrossAppDomainDelegate(delegate()
{
Assembly asm = Assembly.LoadFrom(@"Plugin.dll");
IPlugin plugin;
foreach (Type type in asm.GetTypes())
{
Type intface = type.GetInterface("PluginTest.IPlugin", true);
if (intface != null)
{
plugin = (IPlugin)Activator.CreateInstance(type);
plugin.SayHello();
break;
}
}
}));
AppDomain.Unload(appDomain);[/cs]
Nur möchte ich natürlich auch auf das Plugin zugreifen können. Das geht aber im Moment nur über den Delegate. Und sobald der delegate durch ist, ist alles was Instanzen war vergessen.
Wie greife ich also auf die DLL in der AppDomain zu?
Ich hab mir dazu schon dieses Tutorial angeschaut, was im Endeffekt genau das realisiert, aber ich verstehe es nicht ...
http://get-the-solution.net/in…23-Plugins-mit-AppDo.html
Gruß
florian0