Ich habe ein Plugin-System, wo ich MarshalByRefObject
verwenden, um isolierte Domänen pro Plugin zu erstellen, so dass Benutzer ihre neuen Versionen neu laden können, wie sie sehen, ohne die Hauptanwendung ausschalten zu müssen.Wie kann ich zwischen Plugins kommunizieren?
Jetzt muss ich einem Plugin erlauben zu sehen, welche Plugins gerade laufen und vielleicht ein bestimmtes Plugin starten/stoppen.
Ich weiß, wie Befehle von der Hülle zu geben, die im folgenden Code zum Beispiel:
using System;
using System.Linq;
using System.Reflection;
using System.Security.Permissions;
namespace Wrapper
{
public class RemoteLoader : MarshalByRefObject
{
private Assembly _pluginAassembly;
private object _instance;
private string _name;
public RemoteLoader(string assemblyName)
{
_name = assemblyName;
if (_pluginAassembly == null)
{
_pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
}
// Required to identify the types when obfuscated
Type[] types;
try
{
types = _pluginAassembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => t != null).ToArray();
}
var type = types.FirstOrDefault(type => type.GetInterface("IPlugin") != null);
if (type != null && _instance == null)
{
_instance = Activator.CreateInstance(type, null, null);
}
}
public void Start()
{
if (_instance == null)
{
return;
}
((IPlugin)_instance).OnStart();
}
public void Stop()
{
if (_instance == null)
{
return;
}
((IPlugin)_instance).OnStop(close);
}
}
}
Also dann könnte ich zum Beispiel:
var domain = AppDomain.CreateDomain(Name, null, AppSetup);
var assemblyPath = Assembly.GetExecutingAssembly().Location;
var loader = (RemoteLoader)Domain.CreateInstanceFromAndUnwrap(assemblyPath, typeof(RemoteLoader).FullName);
loader.Start();
Natürlich ist die oben ist nur ein Probe wieder aufgenommen ...
Dann auf meinem Wrapper habe ich Methoden wie:
bool Start(string name);
bool Stop(string name);
die im Grunde einen Wrapper ist der Start/Stops eines bestimmten Plugins aus der Liste und eine Liste zur Ausgabe Spur des laufenden Plugins zu halten:
List<Plugin> Plugins
Plugin ist nur eine einfache Klasse, die Domain
, RemoteLoader
Informationen hält usw.
Was ich nicht verstehe, ist, wie man das unten erreicht, von innen ein plugin. In der Lage:
- Ansicht der Liste der laufenden Plugins
- das Ausführen Start oder Stopp für ein bestimmtes Plugin
Oder wenn dies überhaupt möglich ist mit MarshalByRefObject
angesichts der Plugins sind isoliert oder ich würde müssen Sie einen anderen Kommunikationsweg dafür öffnen?
Ich fühle mich so dumm, es war so einfach und ich konnte nicht verstehen, wie man es von dem, was usr gesagt haben, zu implementieren :(Danke Evk, dass es wirklich einfach macht, das Konzept zu verstehen und umzusetzen. – Guapo
Mann, Evk du stehst die Prämie, ich hätte es für weniger Punkte getan! – usr
Tut mir leid, Kopfgeld bringt mich dazu, meine Meinung zu verlieren und schlimme Dinge zu tun, die ich bereuen werde ... – Evk