Benutzer mit den meisten Antworten
MEF mit Plugins und Debugging

Frage
-
Hallo zusammen und schönen guten Morgen!
In meiner Projektmappe habe ich 3 Projekte. Schema ist MVVM:
1. Das Hauptprojekt, dieses lädt per MEF Plugins.
2. Der InterfaceAdapter, dieser hat Schnittstellen und eine Klasse "WorkspaceViewModel" welche von MVVM Light ViewModelBase ableitet. Dieses Klasse nutzen alle Sichten in der Anwendung und auch Plugins
3. Ein Plugin. Ein Fenster mit einem ViewModel.Hauptprojekt -> Referenz nach InterfaceAdapter
Plugin -> Referenz nach InterfaceAdapterJetzt das kuriose: Ich setzte einen Breakpoint in InterfaceAdapters WorkspaceViewModel. Im Hauptprojekt wird ein Child-Fenster mit vererbten WorkspaceViewModel geladen, danach das Plugin (welches ebenfalls ein WorkspaceViewModel nutzt). Zwei mal wird beim Haltepunkt gewartet, wie gewünscht.
Nun dasselbe, nur das im Hauptprojekt "kein" WorkspaceViewModel initialisiert wird, sondern nur das im Plugin. Die Haltepunkte zeigen keine Fehler (Kann nicht erreicht werden usw.) werden aber nie erreicht, bzw. es wird einfach nicht gestoppt. Ausgeführt wird der Code allerdings im WorkspaceViewModel. Instanziere ich später (Nach dem holen der Plugins) ein WorkspaceViewModel, so wird wieder beim Breakpoint gehalten.
Liegt dies daran, dass das Plugin "im laufenden Ladeprozess" durch MEF des Hauptprojekts quasi als Externe Assembly auf den gemeinsamen InterfaceAdapter zugreift und dadurch der Debugger nicht hält? Denn sobald das Hauptprojekt vorher ein WorkspaceViewModel initialisiert, wird auch vom Plugin aus dort gehalten.
Danke für eure Spekulationen :-)
Gruß, Flo
FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!
Antworten
-
Streng genommen agiert das PlugIn dann irgendwie nicht wirklich autark; es ist auf Resourcen des Hauptprogramms angewiesen um korrekt (oder überhaupt) zu funktionieren. Aber das ist auch ein bisschen Geschmacksache, denke ich.
Ich handhabe es grundsätzlich so, daß Resourcen (mal ganz einfach gesprochen: z.B. eine Übersetzung in einer MultiLanguage Applikation) die von verschiedenen Binaries genutzt werden, in einer eigenen Binary ausgelagert werden und dann jeweils referenziert sind.
Bei Instanzen von Objekten bedeutet das, daß das Projekt mit der Objektdefinition von den jeweiligen Projekten referenziert wird und
- entweder jeder seine eigene Instanz erstellt oder
- die Instanz MEF Shared zur Verfügung gestellt wird
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 17. Juni 2019 06:10
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 26. Juni 2019 13:44
-
Fehler gefunden.
Sowohl in der App.xaml, als auch in der UserControl.Resource des Plugins richte ich den statischen ViewModelLocator (im InterfaceAdapter) ein: <ia:SimpleViewModelLocator x:Key="Locator"/>
Als ich den Locator umbenannte im Plugin, kam immer die Fehlermeldung beim initialisieren: Die Resource "Locator" kann nicht gefunden werden. Das Plugin sucht also "immer" in der App.xaml des Hauptprojekts.
Von daher einfach weg lassen im Plugin und alles läuft fehlerfrei und hält an Breakpoints. Nur eine unschöne Sache: Natürlich jammerd der Designer, dass er die Resource "Locator" nicht finden kann (Klar, das Hauptprojekt ist dem Plugin ja unbekannt). Wie löst ihr das mit einem Zentralen ViewModelLocator in einem Plugin?
Gruß Flo
FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!
- Als Antwort vorgeschlagen Christoph Biegner Mittwoch, 12. Juni 2019 11:12
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 26. Juni 2019 13:44
Alle Antworten
-
WorkspaceViewModel ist auch ein Shared Export?
Auf jeden Fall ist es quasi zwei mal bekannt/'vorhanden': Im Hauptprogramm und im PlugIn. Nutzt das Hauptprogramm das WorkspaceViewModel wird dort natürlich auch als erstes eine Instanz erzeugt und selbige dann im PlugIn verwendet. Erzeugt das Hauptprogramm keine Instanz, übernimmt das dann das PlugIn.
Dennoch würde ich dann erwarten daß am Breakpoint gestoppt wird; an anderen Breakpoints im PlugIn würde ja auch gestoppt werden... oder ist das Plugin kein Teil deiner Solution und liegt nur als binary vor?
-
Hi Christoph,
nein, das Plugin ist teil der Solution und ja, Breakpoints halten im Plugin wie erwartet. Nur, wie du schon richtig beschrieben hast, wenn das Plugin als erstes ein WorkspaceViewModel instanziert halten die Breakpoints im WorkspaceViewModel nicht.
Das WorkspaceViewModel ist kein Shared Export. Da beide Projekte eine Referenz haben, holen sie sich die Vererbung direkt (class xy : WorkspaceViewModel) Kann es daran liegen, dass der ViewModelLocator (liegt auch im InterfaceAdapter) im Plugin als Static geladen wird (DataContext="{Binding Source={StaticResource Locator}, Path=xy}")?
UPDATE: Der ViewModelLocator befindet sich auch in dem "InterfaceAdapter". Wird dieser als erstes vom Plugin aufgerufen, hält auch dort kein Haltepunkt. Wird dieser als erstes von der Hauptanwendung aufgerufen, hält dort und auch beim Plugin der Breakpoint.
MfG Flo
FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!
- Bearbeitet Flo0806 Mittwoch, 12. Juni 2019 08:00
-
Fehler gefunden.
Sowohl in der App.xaml, als auch in der UserControl.Resource des Plugins richte ich den statischen ViewModelLocator (im InterfaceAdapter) ein: <ia:SimpleViewModelLocator x:Key="Locator"/>
Als ich den Locator umbenannte im Plugin, kam immer die Fehlermeldung beim initialisieren: Die Resource "Locator" kann nicht gefunden werden. Das Plugin sucht also "immer" in der App.xaml des Hauptprojekts.
Von daher einfach weg lassen im Plugin und alles läuft fehlerfrei und hält an Breakpoints. Nur eine unschöne Sache: Natürlich jammerd der Designer, dass er die Resource "Locator" nicht finden kann (Klar, das Hauptprojekt ist dem Plugin ja unbekannt). Wie löst ihr das mit einem Zentralen ViewModelLocator in einem Plugin?
Gruß Flo
FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!
- Als Antwort vorgeschlagen Christoph Biegner Mittwoch, 12. Juni 2019 11:12
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 26. Juni 2019 13:44
-
Streng genommen agiert das PlugIn dann irgendwie nicht wirklich autark; es ist auf Resourcen des Hauptprogramms angewiesen um korrekt (oder überhaupt) zu funktionieren. Aber das ist auch ein bisschen Geschmacksache, denke ich.
Ich handhabe es grundsätzlich so, daß Resourcen (mal ganz einfach gesprochen: z.B. eine Übersetzung in einer MultiLanguage Applikation) die von verschiedenen Binaries genutzt werden, in einer eigenen Binary ausgelagert werden und dann jeweils referenziert sind.
Bei Instanzen von Objekten bedeutet das, daß das Projekt mit der Objektdefinition von den jeweiligen Projekten referenziert wird und
- entweder jeder seine eigene Instanz erstellt oder
- die Instanz MEF Shared zur Verfügung gestellt wird
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 17. Juni 2019 06:10
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 26. Juni 2019 13:44
-
Danke,
in die Richtung habe ich dies nun auch umgesetzt und es läuft traumhaft! Vielen Dank!
Gruß Flo
FLOGERSOFT.de - Top Apps, wie z.B. 'Die Taschenlampe' oder ganz neu dabei: 'LiveClock' die Echtzeituhr für ihre Windows Phone Live-Kachel - mit Wettervorhersage!