| 

.NET C# Java Javascript Exception

5
Ich setze derzeit das Managed AddIn Framework für das Laden von grafischen Plugins in einer XBAP-Anwendung (WPF) ein. Damit die Plugins auch wieder komplett entladen werden können, setze ich zusätzlich auf AppDomains.

Außerdem habe ich die Eigenschaft ShadowCopyFiles aktiviert, was bewirkt, das alle Dateien die für das Plugin geladen werden, in einen seperaten "Temp"-Ordner kopiert werden. Leider ist das nicht der Fall bei Konfigurationsdateien. Meine Frage währe nun, ob jemand eine Möglichkeit kennt, eine Konfigurationsdatei mit kopieren zu lassen.

Zum besseren Verständnis wie es derzeit abläuft.

string[] warnings = AddInStore.Update(ConfigReader.PluginPath());

if (warnings.Length > 0)
{
string msg = "Konnte die Pipeline nicht generieren:";
foreach (string warning in warnings) msg += "\n" + warning;
MessageBox.Show(msg, "Fehler", MessageBoxButton.OK, MessageBoxImage.Warning);
return false;
}

Collection<AddInToken> addInTokens = AddInStore.FindAddIns(typeof(AddInHostView), ConfigReader.PluginPath());

AddInToken = addInTokens[0];

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = AddInToken.AddInFullName;
setup.CachePath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), "MyApp");
setup.ApplicationBase = setup.CachePath;
setup.ShadowCopyFiles = "true";
setup.LoaderOptimization = LoaderOptimization.MultiDomainHost;

PermissionSet perm = new PermissionSet(PermissionState.Unrestricted);

AppDomain domain = AppDomain.CreateDomain(AddInToken.Name, null, setup, perm);

AddInHostView addInHostView = AddInToken.Activate<AddInHostView>(domain);


Was passiert hier?

  • Es wird zuerst ein Update vom Pluginspeicher durchgeführt
  • Es werden mögliche Plugins gesucht (FindAddIns)
  • Zu Testzwecken nehme ich das allererste Plugin (addInTokens[0])
  • AppDomainSetup wird erstellt
  • Das Plugin wird in der neuen AppDomain aktiviert


Nun hab ich schon versucht im AppDomainSetup die Eigenschaft ConfigurationFile zu setzen, das bewirkt aber rein gar nichts. Evtl. hat ja jemand von euch andere Ansätze.
08.03.2011
Konstantin 3,7k 8
2 Antworten
3
Die Lösung war doch einfacher als gedacht :-)

AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationName = AddInToken.AddInFullName;
setup.CachePath = Path.Combine(System.IO.Path.GetTempPath(), "MyApp");
setup.ApplicationBase = Path.Combine(ConfigReader.PluginPath(), @"AddIns\DemoAddIn");
setup.ConfigurationFile = "DemoAddIn.config";
setup.ShadowCopyFiles = "true";
setup.LoaderOptimization = LoaderOptimization.MultiDomainHost;


Das Problem war, das ich die Eigenschaft ApplicationBase falsch gesetzt habe. Es muss auf den Pfad zeigen, wo das AddIn derzeit liegt. Die zusätzliche Eigenschaft ConfigurationFile erledigt dann den Rest ;-)

Hinweiß
Von der Konfigurationsdatei wird keine Schattenkopie gemacht, die Konfiguration wird in den Arbeitsspeicher geladen, was zum Glück die Datei nicht sperrt, falls man ein Update veröffentlichen möchte.
15.03.2011
Konstantin 3,7k 8
0
Ergänzend möchte ich dazu sagen, hat ein MAF Plugin mehrere Konfigurationsdateien z.B.:

DemoAddin.dll
DemoAddin.dll.config
Company.Common.dll
Company.Common.dll.config
Company.Db.dll
Company.Db.dll.config


Funktioniert die Methode von meiner alten Antwort nicht, dazu muss man noch folgenden Punkt aktivieren:

ShadowCopyDirectories = ""


Dann kann er auch die anderen Konfigurationsdateien finden, egal wie man sie im Projekt anspricht.
17.04.2012
Konstantin 3,7k 8

Stelle deine .net-Frage jetzt!