Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD
Bedoel je nu iets als How to remove MEF plugins at runtime ? Er is een reden dat Firefox moet herstarten als je een plugin disabled.
Verder zou ik de settings door de hoofdapplicatie laten beheren (plugins zijn natuurlijk niet te vertrouwen
).
Verder zou ik de settings door de hoofdapplicatie laten beheren (plugins zijn natuurlijk niet te vertrouwen
Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten
Nee, plugins hoeven niet verwijdert te worden, enkel disabled of enabled. Waar ik niet uit geraak is waar ik het best de "Enabled" property plaats. In IPlugin lijkt me niet aangeraden (?) sinds plugins kunnen doen wat ze willen met de getter en setter (bv Enabled { get { return true; } set; } i.p.v gewoon Enabled { get; set;
. We maken ook gebruik van SQLite. Misschien is het het best om daar een tabel toe te voegen met PluginGuid en Enabled velden?
Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD
Je geeft zelf al aan al aan een plugin manager class te hebben. Het lijkt mij dat het aan en uit zetten van plugins hoort bij de verantwoordelijkheid van deze klasse, en niet bij de plugins zelf zoals pedorus al aangeeft. Verder weet ik niet veel van MEF maar het lijkt me prima om in status bij te houden in SQLite.
Als je je om vijandige plugins druk maakt die zichzelf niet correct uit willen schakelen, dan heb je een groter probleem. Vergeet niet dat MEF composable parts allemaal binnen hetzelfde AppDomain draaien met allemaal dezelfde rechten en dus aardig wat binnen je programma kunnen rommelen als er zelfs maar een beetje reflection gebruikt kan worden. Je moet er dus vanuit kunnen gaan dat plugins met MEF zich gewoon netjes gaan gedragen.Hyperz schreef op woensdag 14 december 2011 @ 17:59:
Nee, plugins hoeven niet verwijdert te worden, enkel disabled of enabled. Waar ik niet uit geraak is waar ik het best de "Enabled" property plaats. In IPlugin lijkt me niet aangeraden (?) sinds plugins kunnen doen wat ze willen met de getter en setter (bv Enabled { get { return true; } set; } i.p.v gewoon Enabled { get; set;. We maken ook gebruik van SQLite. Misschien is het het best om daar een tabel toe te voegen met PluginGuid en Enabled velden?
Hier is hoe ik het op zou lossen:
- Maak je plugins altijd disposable. D.w.z. IPlugin moet van IDisposable afstammen.
- Haal de GUID uit je plugin interface en maak hier (strongly-typed) export metadata van.
- Optioneel: maak een custom export attribuut (bijv. ExportPluginAttribute) wat altijd deze metadata vereist. Dit maakt het moeilijker om deze metadata per ongeluk te vergeten mee te geven.
- Schrijf een ExportProvider die een bestaande ExportProvider implementatie decoreert. Deze moet als filter dienen en enkel de ExportDefinition instanties terug geven waarvan de GUID (uit de export metadata!) in een aangeleverde collectie ingeschakelde plugin GUIDs voorkomt.
- Gebruik deze filter ExportProvider als invoer voor je CompositionContainer.
Assembly DLLs die plugins bevatten blijven hiermee wel gelocked totdat de applicatie afgesloten wordt. Daar is eventueel nog omheen te werken door tijdens de applicatie start shadow copies te maken en MEF enkel op de copies te laten werken.
[ Voor 8% gewijzigd door R4gnax op 14-12-2011 20:33 ]
Bedank voor de info R4gnax
. Lijkt me idd een mooie oplossing, en recomposition is al enabled op de imports.
Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD
Pagina: 1