Links
Screencast
[jwplayer mediaid=“2230”]
Was ist passiert?
Ich muss dazu erstmal bemerken, dass ich ein großer Freund von Konventionen und Ordnung in Projekten bin. Daher habe ich für mich genau eine solche Konvention geschaffen, die das Benennen von Projekten betrifft. Zur Erklärung vielleicht erstmal ein Screenshot meines Solution Explorers:[caption id=“attachment_2212” align=“alignnone” width=“150”] Abb. 1: Projektstruktur[/caption]
Der Sinn ist nun der, dass sich die Struktur direkt in den Namespaces und Assembly-Namen widerspiegelt. Hier am Beispiel des Data.Core-Projektes erstmal die Projekteigenschaften:
[caption id=“attachment_2213” align=“alignnone” width=“150”] Abb. 2: Data.Core-Eigenschaften[/caption]
und die AssemblyInfo.cs:
[csharp title=“Listing 1=AssemblyInfo.cs 2=des 3=Projektes 4=Data.Core” language=1:] using System.Reflection;
[assembly: AssemblyTitle(“SampleSolution.Data.Core”)] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct(“Core”)] [assembly: AssemblyCopyright(“Copyright © 2013”)] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyVersion(“1.0.0.0”)] [assembly: AssemblyFileVersion(“1.0.0.0”)] [/csharp]
Ok. Logik und UI sind nach dem gleichen Schema aufgebaut. Ich baue das Projekt und nun entstehen in den bin-Ordnern logischerweise die richtigen Dateien.
Setzen einer Referenz in UI
Jetzt will ich dem UI-Projekt eine Referenz auf das Data-Projekt hinzufügen. Also Rechtsklick auf References und dann Add Reference:[caption id=“attachment_2216” align=“alignnone” width=“150”] Abb. 3: Referenz auf Data.Core setzen[/caption]
Das klappt erstmal super:
[caption id=“attachment_2217” align=“alignnone” width=“150”] Abb. 4: Referenz ist angekommen[/caption]
Aber wehe, ich versuche das nun noch mit Logic.Core:
[caption id=“attachment_2218” align=“alignnone” width=“150”] Abb. 5: Fehler beim 2. Core-Projekt[/caption]
Wie beim oben gelinkten stackoverflow-Artikel richtig geantwortet, kann man das nun lösen, indem man den Projekten z.B. den Namespace-Ordner-Namen voranstellt. Das würde dann ungefähr so aussehen:
[caption id=“attachment_2219” align=“alignnone” width=“150”] Abb. 6: Quick-Fix[/caption]
Bewertung
Bis herher könnte man das ganze noch als nervig bezeichnen. Viele werden dieses Problem gar nicht haben, weil sie die Projekte nicht so benennen, wie ich. Andere werden sage: Na dann benenne ich sie halt um. Ich vertrete jedoch den Standpunkt, dass dies in großen Projekten schlechterdings oft nicht möglich ist. Da will ein UI-Entwickler nun VS 2013 einsetzen, öffnet die Projektmappe und kann plötzlich keine Referenzen mehr setzen.Das große Problem ist nämlich hier: Es geht im Visual Studio 2012 ohne Probleme!!!
Das gleiche im Visual Studio 2012
Ich schließe das Projekt nun im VS 2013 und öffne es einfach in VS 2012. Jetzt nehme ich die Änderungerungen aus Abb. 6 zurück und füge beide "Core"-Projekte der Solution hinzu. Das Ergebnis ist ganz sauber das Folgende:[caption id=“attachment_2221” align=“alignnone” width=“150”] Abb. 7: Erfolgreich im VS 2012[/caption]
Das Beste kommt aber noch: Speichere ich jetzt alles im VS 2012 und öffne V die Solution dann wieder imS 2013, funktioniert alles einwandfrei.
Zusammenfassung
Der Dialog zum Hinzufügen einer Referenz zu Projekten im VS 2013 hat meiner Meinung nach einen Bug. Das führt zu einem Breaking Change zwischen VS 2012 und VS 2013 und entgegen der Aussagen von Microsoft sind die Solution-Dateien nicht kompatibel zueinander. Der Bug entsteht dadurch, dass beim Hinzufügen der Referenzen in VS 2012 Folgendes in der *.csproj-Datei entsteht:[xml title=“Listing 1=*.csproj 2=in 3=VS 4=2012” language=2:]
VS 2013 macht das beim Hinzufügen der Referenz auf Data.Core so:
[xml title=“Listing 1=VS 2=2013-Referenz” language=3:]
Da ist natürlich kein Platz mehr für ein weiteres Projekt mit dem Name-Tag “Core”.