Visual Studio Tipps und Tricks, Teil 39: Codereuse mit Shared Projects – auch außerhalb von Apps
Heute ein etwas längerer Tipp. Aber er ist es allemal wert:
Mit Visual Studio 2013 Update 2 wurden ja die Universal Windows Apps eingeführt, die das “Shared Project” eingeführt haben. Mittels Shared Project ist es möglich, Quellcode auf einfache Weise zwischen mehreren Projekten zu teilen – alles was im Shared Project liegt ist in allen Projekten verfügbar, die das Shared Project referenzieren.
Standardmäßig gibt es diese Funktion nur für Universal Apps – alle anderen Projekte bleiben außen vor. Wäre es nicht schön genau diese Möglichkeit auch für herkömmliche Desktopapplikationen zur Verfügung zu haben? Logo!
Wenn man ein bisschen mit den Shared Projects herumspielt, wird man feststellen, dass das ohne größeren Aufwand möglich ist. Zu Demozwecken habe ich eine Universal App angelegt. Wie man sieht referenzieren beide Client-Projekte das Shared Project.
Wenn wir nun das Windows Phone Projekt entladen können wir uns den Aufbau der dahinterliegenden XML Datei ansehen und werden sehen, dass es sich dabei technisch um ein einfaches Import-Statement handelt.
Entladen:
Edit klicken, um das XML zu sehen:
Hier ist das Import-Statement:
Hier steht dann zum Beispiel:
<Import Project="..\MyProject.Shared\MyProject.Shared.projitems" Label="Shared" />
Wenn wir nun ein weiteres Projekt – zum Beispiel eine weitere Windows 8 App – zur Solution hinzufügen, dann können wir diesen Schnipsel-Code auch dort im Projekt-XML einfügen und erhalten ebenso eine Referenz auf das Shared Projekt. Aber Achtung. Beim Hinzufügen eines neuen Projektes liegt dieses vermutlich eine Ebene höher im Dateisystem – außer Ihr habt das schon beim Anlegen berücksichtigt.
Den Pfad müsst Ihr also entsprechend anpassen. Der Screenshot unten sollte das verdeutlichen. Ich habe hier die Windows App “AnotherWindowsApp” mit in die Solution aufgenommen und eine entsprechende Referenz eingefügt.
Das Ergebnis: Wir haben jetzt 3 Projekte, die sich ein “Shared Project” teilen. Cool!
Man kann das jetzt natürlich auf die Spitze treiben… und könnte auf die Idee kommen mehrere Shared Projects zu referenzieren – auch das geht. Logischerweise muss man ein bisschen darauf Rücksicht nehmen, was man wo liegen hat und, dass man nichts doppelt teilt.
Exemplarisch habe ich jetzt noch eine Desktop WPF Anwendung hinzugefügt. Das geht technisch auch – man muss allerdings aufpassen, was geteilt wird, da das Desktop WPF XAML und das Windows Store App XAML nicht vollständig kompatibel sind. Hinzukommt, dass man natürlich keine 2 App.xaml in einem Projekt haben darf. Hier helfen die Fehlermeldungen weiter.
Richtig abgefahren wird es, wenn man sich XAMARIN installiert und dann auch noch die Möglichkeit hat Code zu Teilen zwischen Windows Apps, Windows Phone, Desktop, Android und iOS. Siehe Screenshot.
Schön ist, dass das ganze, sobald es einmal angelegt ist auch Drag&Drop unterstützt – das heißt es ist wirklich leicht neue Dateien zum geteilten Projekt hinzuzufügen.
Tl;dr;
Das “Shared Project” funktioniert auch außerhalb der App-Welt, auch wenn es dafür kein leeres Template gibt.
Kurzer Text am Rande:
Dieser Post ist Teil einer längeren Serie, in der ich ein paar der vielleicht nicht ganz so bekannten Features von Visual Studio vorstellen werde. Ich hoffe, für Euch ist der ein oder andere Kniff dabei, den Ihr noch nicht kanntet. Und wenn ihr ihn doch schon kennt: Seid stolz auf Euch und verratet den Trick auch dem Entwickler neben Euch.
Comments
- Anonymous
August 05, 2014
Na das klingt doch mal interessant :) Ich habe anfangs nicht ganz verstanden, wie das Funktionieren soll. Schließlich haben doch Desktop und Apps verschiedene Klassen für alles. Beim Ansehen der csproj-Datei ist mir aber aufgefallen, das die normalen Verweise Reference-Tags sind. Das Shared-Project aber ein Import-Tag hat. Es scheint also eher so zu sein, das der Inhalt des Shared-Projekts zunächst in jedes Zielprojekt importiert wird und dann die richtigen Klassen zur Projektvorlage heraus gesucht werden. Es ist also kein Verweis sondern wirklich nur die Schnittmenge des gemeinsamen Codes. Noch ein kleiner Tipp: Für die Apps sind die Kompilerkonstanten WINDOWS_APP und WINDOWS_PHONE_APP vordefiniert. Man kann sich für andere Projekttypen unter Projekt > Eigenschaften > Erstellen > Symbole für bedingte Kompilierung selbst so eine Konstante anlegen um spezielle Desktopklassen o.ä. nutzen zu können.