SolutionExplorer - OpenSource

    • VB.NET

    Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      SolutionExplorer - OpenSource

      Im Visual-Studio fehlten mir ein paar Features - v.a. die Möglichkeit, jederzeit ein Backup zu machen.

      Ja, Fange ich doch gleich mit den Features an.
      1. SolutionExplorer ist so eingerichtet, dass er eine Solution über den DateiBrowser öffnet, DateiBrowser-Kontextmenü "Öffnen mit..."
      2. verzippt mit einem Click alle in der Solution eingebundenen Sources und Resources.
        Compile-Ausgaben und andere Dateien, die nicht im Projekt-Explorer der IDE aufgeführt sind, werden nicht mit aufgenommen (schlanker Zip).
        Die Zips werden durchnummeriert im "...\SolutionVerzeichnis\BackZip" abgelegt. Sie sind nach entpacken sofort lauffähig, sofern alle erf. Dateien auch in die Solution eingebunden sind.
        Der Pfad des Zips wird außerdem in die Windows-Zwischenablage kopiert, für besonders eilige Uploads ;).
        (Da kann man nämlich hier im Forum unter Dateianhänge ohne "Durchsuchen" gleich einpasten und up damit)
      3. erstellt einen Solution-Clone
        Das wird selten gebraucht - ist einfach die Vorstufe eines Zips, nur halt unverzippt.
      4. CreateTemplateChild
        Das ist was sehr feines. Man gibt einen neuen Namen für die Solution an, und SolutionExplorer erstellt einen umbenannten Clon.
        Auf diese Weise ist jedes Projekt Vorlage (Template) für weitere Projekte.
        Ich habe mir extra VorlagenProjekte für Dataset-Anwendungen, Datenbank-Anwendungen, Konsole und WPF gemacht.
        Da kann ich nun einfach einen TemplateChild anlegen, und habe sofort ein Projekt, mit einem leeren Form, und dem gesamten Infrastruktur-Code, den ich mir dann und wann für diesen Bedarf zurechtgecodet habe.
        Falls ich für eine Idee schon ein leidlich verwendbares Projekt habe, wassich "nur" variieren muß, dann nehme ich natürlich dieses als Template, anstelle eines meiner VorlagenProjekte.
        Meine Solutions bestehen immer aus dem eigentlichen Projekt, und weiteren "Helper-Projekten" mit sog. "Infrastruktur-Code", auf den ich aus vielen Projekten zurückgreifen kann.
        Helper-Projekte liegen in einem anderen Ordner, nicht unterhalb des eigentlichen Solution-Ordners. Daher werden sie nicht mit-geklont, wennich ein TemplateChild erstelle, sondern der TemplateChild nimmt den Verweis auf den Helper mit hinüber.
        Ich starte also nie die IDE direkt, sondern suche gleich im DateiBrowser die Solution auf, die ich haben will. So habe ich eine bessere Kontrolle, wo die IDE mir meine Sachen hinspeichert.
        Und wenn ich ein neues Projekt anlege, mussichmich nicht durch die dummen IDE-Dialoge klicksen, die "WindowsApplication1" umbenennen, klarmachen, wo ich das Projekt hinhaben will, etc., sondern ich wähle ein bereits bestehendes Projekt aus, mache einen TemplateChild, und kann damit loslegen, mit einem ordentlich benamten Projekt, schon mit MainForm drin, incl. Menüstrip, und allen erforderlichen Verweisen :)
      5. (Ich schiebe die Besprechung der nächsten beiden Menüpunkte nach hinten, und mach weiter mit) "Convert":
        Damit kann ich Veränderungen am SolutionFile vornehmen, etwa eine mit Ultimate-Edition erstellte Solution umwidmen für Express-Editions, damit "Low-Budget"-Programmierer ;) die auch direkt öffnen können.
        Auch kann ich Files wählen, und deren Encoding switchen, zwischen Utf8 und Ansi. Das braucht man aber nur selten, etwa wenn man ander Leuts Solution anguckt, und da Encoding-Mismatches auftreten.
        Ist auch sone Sache, damit hat man natürlich auch blitzgeschwind einen Encoding-Mismatch verbrochen (Aber Backup machen ist jetzt ja kein Thema mehr ;) ).
      6. Jo, die vorhin übersprungenen Menüpunkte beziehen sich rein auf die Anzeige: Reload lädt die Solution neu in den SolutionExplorer - eigentlich unnötig, denn der aktualisiert eh vor jedem Backup-, Clone-, TemplateChild-machen
      7. Dann gibts da noch eine Combo, mit der kann man die angezeigten Dateien filtern: Entweder nur Source-Codes, oder alles, oder die Helpers-Projekte ausschließen
      8. SolutionExplorer unterstützt auch c#-Projekte

      Im Grunde ist die ganze aufwändige Anzeige überflüssig, und es täten die Menüpunkte 2. - 5. ausreichen - ich hab die Anzeige vor allem während der Entwicklung gebraucht

      Funktionsweise
      SolutionExplorer liest das .sln-File ein, und analysiert, welche Projekt-Dateien ("vbProj/csProj") in der Solution zusammengebunden sind.
      Dann öffnets die ProjektDateien und liest aus dem Xml aus, welche Dateien zum jeweiligen Projekt gehören.
      Das ganze Zeug wird in ein typisiertes Dataset eingetragen (ja - ich kannnix anneres ;) ), und aus dem wird dieser hübsche Treeview aufgebaut.
      Ja damit habichdann die Kontrolle über die Solution, und kann damit treiben, was erforderlich ist (kopieren, Text-Ersetzungen, zippen).

      Installations-Schritte
      1. Kompilieren, vorzugweise als "Release"
      2. Optional: Den Ordner mit der Kompilier-Ausgabe umbenennen und an einen sinnvollen Ort verschieben.
      3. Im DateiBrowser: Rechtsklick auf irgendeine Solution, und im KontextMenü "Öffnen mit" - "StandardProgramm auswählen..." anwählen.
      4. "Durchsuchen..." - nämlich nach der SolutionExplorer.exe, wo ihr sie hingeschoben habt.
      5. Wichtig! Sicherstellen, dass die Checkbox "Datei immer mit diesem Programm öffnen" nicht gecheckt ist! Ansonsten öffnet in Zukunft bei Doppelklick auf eine Solution nicht mehr VisualStudio die Solution, sondern nurnoch der Solution-Explorer.
        Schritt 5. erzeugt für die Zukunft im DateiBrowser-KontextMenü "Öffnen mit..." einen Eintrag für den Solution-Explorer, mit dem ihr nun jedes Solution-File öffnen könnt. Die Standard-Registrierung, dass eine Solution bei Doppelklick vom VisualStudio geöffnet wird, bleibt dabei unangetastet.

      Ich empfehle übrigens, im DateiBrowser die (idiotische) Option "bekannte Datei-Endungen ausblenden" zu deaktivieren - dann findet man die .sln - Files auch leichter.

      Der Code
      Wie mein RegexTester auch, ist SolutionExplorer ein altes Projekt von mir, und daher würdich heute wieder vieles anders machen. Und die Kommentierung ist ebenfalls nicht lehrbuchmäßig für Einsteiger, sondern richtet sich an - ich sag mal: Fortgeschrittene (nämlich an mich selbst ;) )
      Bei der Überarbeitung für den Upload waren bisserl umfangreichere Umbauten nötig - also wenn ihr Bugs findet - bitte lasstes mich wissen, vorzugsweise per PM, um diesen Thread nicht überlang zu machen.

      Issues
      • SolutionExplorer berücksichtigt nicht die versteckte Datei "XySolution.suo", in der VisualStudio niederlegt, welche Fenster als letztes geöffnet waren, und welches Projekt als Start-Projekt festgelegt ist.
        Dadurch kann, wenn eine Solution mehrere Projekte enthält, beim erstmaligen Entpacken eines Zips ein falsches StartProjekt eingestellt sein (ihr kriegt dann vlt. den LaufzeitFehler "eine Klassenbibliothek kann nicht Startprojekt sein").
        Dann muß man das Startprojekt eben wieder richtig setzen (ProjektExplorer-Kontextmenü)
        Alternativ kann man, bevor man zippt, die .sln-Datei im Editor öffnen, und das gewünschte Startprojekt händisch an die erste Stelle setzen, denn wenn VS keine .suo-Datei vorfindet, legt es das erste vorgefundene Projekt als Startprojekt fest.
        Beispiel (.sln-Datei des SolutionExplorers):
        Microsoft Visual Studio Solution File, Format Version 11.00
        # Visual Studio 2010
        Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Helpers", "Helpers\Helpers.vbproj", "{BC2C4D33-E3C0-4AE8-9B56-D42F497EAF83}"
        EndProject
        Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SolutionExplorer", "SolutionExplorer\SolutionExplorer.vbproj", "{5147727F-1E21-4A97-B5D4-BC4CF299A409}"
        EndProject
        ...
        Hier würde bei Fehlen der .suo das Projekt "Helpers" als Startprojekt kommen.

        Also ändert man auf
        Microsoft Visual Studio Solution File, Format Version 11.00
        # Visual Studio 2010
        Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SolutionExplorer", "SolutionExplorer\SolutionExplorer.vbproj", "{5147727F-1E21-4A97-B5D4-BC4CF299A409}"
        EndProject
        Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Helpers", "Helpers\Helpers.vbproj", "{BC2C4D33-E3C0-4AE8-9B56-D42F497EAF83}"
        EndProject
        ...
        und auch der frisch entpackten Zip wartet mit korrektem StartProjekt auf :)

      • Beim Absturz gleich beim Öffnen einer Solution ist zuerst zu überprüfen, ob die Solution überhaupt funktionstüchtig ist - also in der IDE angucken.
        ZB. eingebundene Dateien, die fehlen (etwa durch den DateiBrowser gelöscht), sind problematisch


      Das Bildchen
      zeigt den SolutionExplorer, wie er sein eigenes Solution-File geöffnet hat. Leider ist der komplette Dateipfad nicht ganz zu lesen, da tief verschachtelt.
      Aber es sind 2 Projekte erkennbar, vom SolutionExplorer-Projekt sind die Dateien aufgeführt (ViewMode.UserCode_Only: also nur die kompilierbaren Dateien), und der Treeview.

      History (2010-Version)
      • 23.1.2018: meine Enum.NameOf()-Extension rausgeworfen, weil ab 2015 erzeugt das eine Namens-Kollision mit dem dortigen neuen NameOf-Operator.
      • 21.5.11: Es scheint Probleme mit annere Windowse zu geben. Auf meiner Virtuellen Maschine läufts aber, mit Win7 und XP - auf Vista isses ja entwickelt.
        Also ich hab jetzt nochmal Exe-Ordner reingestellt, und das Verhalten des SolutionExplorers, wenner direkt gestartet wird, modifiziert
      • 9.12.2013: a) Konvertierungs-Funktionen versch VisualStudio-Versionen, b) Einstellbarkeit der TargetPlatform. c) mit TargetPlatform.AnyCPU konfiguriert
      • 12.9.16: 2008er Versionen entfernt, Code so geändert, dass CompilerWarnings ausbleiben, paar Klassen aus den Helpers rausgeworfen (v.a. um einem Namenskonflikt in VS2015 zu entgehen)
      Dateien

      Dieser Beitrag wurde bereits 15 mal editiert, zuletzt von „ErfinderDesRades“ ()

      ErfinderDesRades schrieb:

      also wenn ihr Bugs findet - bitte lasstes mich wissen, vorzugsweise per PM


      Irgendwie hab ich keine Möglichkeit gefunden, Dir eine PM zu schicken.

      Also, ich habe die CreateTemplateChild-Funktion des SolutionExplorers ausprobiert und habe dazu eine Frage:

      Grundsätzlich funktioniert das prima, nur meine vorhandene Datendatei kann ich dann nicht mehr verwenden.
      Beim Versuch die Daten zu laden gibt es die folgende Fehlermeldung:



      und so wird die Datei geladen:

      VB.NET-Quellcode

      1. Private Sub LadenMainMenuItem_Click(sender As Object, e As EventArgs) Handles LadenMainMenuItem.Click
      2. Dim ofd As New OpenFileDialog
      3. Dim dlgr As DialogResult
      4. ofd.InitialDirectory = Application.StartupPath
      5. ofd.Filter = "Datendateien|*.dat"
      6. dlgr = ofd.ShowDialog()
      7. If dlgr = Windows.Forms.DialogResult.OK Then
      8. Dim fs As FileStream
      9. ' Formatierer erzeugen
      10. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
      11. ' lesen
      12. fs = New FileStream(ofd.FileName, FileMode.Open)
      13. Adressliste = CType(bf.Deserialize(fs), List(Of Adresse))
      14. fs.Close()
      15. fuelleListBox(Adressliste)
      16. zeigeStatusBar()
      17. End If
      18. End Sub


      Ansonsten funktioniert alles. Ich kann neue Daten eingeben, die in eine neue Datei speichern und die dann auch wieder laden.
      Aber es wäre natürlich schöner, wenn ich mit den vorhandenen Daten weiter machen könnte.

      Kannst Du mir sagen, warum das so ist?

      Schon mal vielen Dank!
      Torf
      Umbennen, da NameOf bereits vergeben ist:
      msdn.microsoft.com/de-de/library/dn986596.aspx
      oder VS2013 benutzen ;)

      Edit:
      Hab das gerade nochmal getestet mit meinem Surface mit VS 2015. Genau der Fehler, während es mit VS 2013 ohne Beanstandung läuft.
      Ein Fall für @ErfinderDesRades

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „EaranMaleasi“ ()

      Das funktioniert schon mal. :)
      Was genau bewirken Die Klammern und kann das die Funktionalität beeinträchtigen ?

      Zwei Problem bestehen noch, zum einen gibt es noch ein paar Warnungen:


      Zum anderen kann ich nicht debuggen:
      Die Klammern sorgen dafür, dass man Keywords als Bezeichner verwenden kann.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Kann ich denn in jedem Fall, ein Keyword als Bezeichner verwenden, oder kann das auch Probleme geben, bzw. muß etwas beachtet werden ?

      On Topic:
      Bis auf eine, habe ich alle Warnungen behoben:
      Spoiler anzeigen

      VB.NET-Quellcode: SmallClasses.vb

      1. Public Function IndexOfKey(ByVal Key As TKey) As Integer
      2. IndexOfKey = 0
      3. If MyBase.Dictionary Is Nothing Then
      4. For Each Itm As TItem In Me
      5. If MyBase.Comparer.Equals(Key, Me.GetKeyForItem(Itm)) Then Exit Function
      6. IndexOfKey += 1
      7. Next
      8. Else
      9. Return MyBase.IndexOf(MyBase.Dictionary(Key))
      10. End If
      11. Return -1
      12. End Function
      13. Public Function AddIfNew(ByRef Value As TItem) As Boolean
      14. If Not MyBase.Contains(Me.GetKeyForItem(Value)) Then
      15. MyBase.Add(Value)
      16. Return True
      17. Exit Function
      18. End If
      19. Return False
      20. End Function

      VB.NET-Quellcode: StringX.vb

      1. <Extension()>
      2. Public Function CountChars(ByVal S As String, ByVal Search As Char) As Integer
      3. Dim I As Integer = S.IndexOf(Search)
      4. While I >= 0
      5. CountChars += 1
      6. I = S.IndexOf(Search, I + 1)
      7. End While
      8. Return CountChars
      9. End Function
      10. <Extension()>
      11. Public Function CountSubStrings(ByVal S As String, ByVal Search As String, Optional ByVal Comparison As StringComparison = StringComparison.CurrentCulture) As Integer
      12. Dim I As Integer = S.IndexOf(Search, 0, Comparison)
      13. While I >= 0
      14. CountSubStrings += 1
      15. I = S.IndexOf(Search, I + 1, Comparison)
      16. End While
      17. Return CountSubStrings
      18. End Function

      VB.NET-Quellcode: CollectionX.vb

      1. <Extension()>
      2. Public Function IndexOf(Of T)(ByVal Subj As IEnumerable(Of T), ByVal predicate As Func(Of T, Boolean)) As Integer
      3. IndexOf = 0
      4. For Each O In Subj
      5. If predicate(O) Then Exit Function
      6. IndexOf += 1
      7. Next
      8. Return -1
      9. End Function
      10. <Extension()>
      11. Public Function IndexOf(Of T)(ByVal Subj As IList, ByVal predicate As Func(Of T, Boolean)) As Integer
      12. IndexOf = 0
      13. For Each O As T In Subj
      14. If predicate(O) Then Exit Function
      15. IndexOf += 1
      16. Next
      17. Return -1
      18. End Function

      Den Ursprung der Warnung "Der in Imports "Junkroom" auf Projektebene...", kann ich nicht finden.
      Bitte nochmal drüber gucken.
      komisch - ist mein Thread, und ich hab keine Benachrichtigung bekommen :| .
      Jo, das mittm NameOf habt ihr ja geklärt.
      Evtl. kann man die ganze Klasse (ist glaub EnumValue.vb, oder?) auch rauswerfen - habich selbst kaum benutzt.

      zu "Der in Junkroom..." - da muss man sich einfach genau nach dem richten, was da steht: Da scheint auf ProjektEbene ein GeneralImport eines Namespaces zu bestehen, dens garnet gibt, oder der nix enthält, was man importieren könnte.
      So einen GeneralImport kann/sollte man natürlich rauswerfen.

      Aber ich guck die Zips auch nochmal an - "Junkroom.dll" ist ein uralter Name meiner Helpers-Bibliothek, und bedeutet "Rumpelkammer".
      Inzwischen hab ich meine Helpers wesentlich besser aufgeräumt.
      :)
      Oder hast du da die Uralt-Version von SolutionExplorer gedownloaded - noch aus 2008er Zeiten?
      Die .zip enthält meines wissens nach alles was du benötigst.
      Entpacke es in einen neuen Ordner.
      Nun machst du einen recktsklick auf deine Projektdatei -->öffnen mit --> Programm auswählen. Nun navigierst du zu dem Ordner wo du den SE entpackt hast, wählst die .exe und schon sollte es funktionieren.
      @ErfinderDesRades
      Ich habe versucht von einem meiner Projekte in MVVM Struktur ein BackZip zu erstellen.
      Komischer weise werden aus 2 Projekten die Dateien nicht übernommen, im Solution Explorer werden diese auch nicht angezeigt.
      Anbei ein Bild davon. Es zeigt die betroffenen Ordner und den SolutionExplorer.



      Eine Idee woran das liegen kann?
      Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
      Die gehören ja zu einem Projekt. Deswegen hatte ich die Ordner ja mit auf das Bild geschoben. Ich hatte das kürzlich schon mal als hier im forum etwas anhängen wollte. Kann es sein weil die Projekte. Net Standard sind und kein net framework?
      Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
      @Akanel genau so scheint es zu sein, wenn ich eine komplette solution mit dem Solution Explorer zippe, werden nur die .Net Framework Projekte vollständig gezippt, die .Net Standrad Projekte bleiben leer.
      "Hier könnte Ihre Werbung stehen..."