VB6 nach C#
Ein VB6-basierter VB6 -> C# 2017-Konverter.
Verwendung
Kostenlose Nutzung. Frei zum Forken. Es ist kostenlos, einen Beitrag zu leisten. Kostenlose Anfrage. Frei zu verkaufen. Es steht Ihnen frei, unter Ihrem eigenen Namen zu verkaufen. Es steht Ihnen frei, fast alles zu tun, außer zu sagen, dass ich es nicht darf (siehe LIZENZ).
Grundlegende Informationen finden Sie weiter unten. Weitere Informationen finden Sie im Wiki. Für Unterstützung können Sie sich gerne an uns wenden.
Schnellstart
- Öffnen Sie die Datei
prj.vbp
und starten Sie das Programm (erfordert die VB6-IDE). - Geben Sie über die Schaltfläche einige Konfigurationswerte in das
Config
ein. - Nachdem Sie nun Ihr Projekt ausgewählt haben, klicken Sie auf die Schaltfläche
SCAN
. Dies hilft dem Konverter, den Unterschied zwischen Methoden ohne Klammern und Variablen/Konstanten zu erkennen. Außerdem wird eine vollständige Liste der Importe erstellt (die in der VS 2019-IDE über ^K^E bereinigt werden kann). - Wenn Sie möchten, klicken Sie auf
SUPPORT
um die grundlegende Projektunterstützungsstruktur zu generieren.- Alternativ könnten die Dateien
VBExtension.cs
und VBConstants.cs
direkt aus dem Projektstamm kopiert und woanders eingefügt werden.
- Geben Sie dann einen Dateinamen ein und klicken Sie auf
Single File
um zu versuchen, die daneben eingegebene Datei zu konvertieren.
Wenn Sie das gesamte Projekt konvertieren möchten, klicken Sie einfach auf ALL
. Der Scan, die Support-Generierung und die gesamte Projektkonvertierung werden sofort durchgeführt.
HINWEIS: Es ist vielleicht nicht das schnellste, es erfordert immer noch einen manuellen Aufwand, aber es ist schneller, als alles manuell zu erledigen!
Aktualisierungen 01.12.2021
Die ursprüngliche Version des Konverters ging das Problem blockweise an, indem er jede logische Programmeinheit in einen eigenen String aufteilte und ihn einzeln konvertierte. Dadurch machte der Konverter mehrere Durchläufe und lief grundsätzlich extrem langsam. Nachdem der Linter so aktualisiert wurde, dass er nicht diesen Ansatz verwendet, sondern den Code einfach von oben nach unten durchläuft, schien es offensichtlich, dass der Konverter dasselbe mit genauso großer Genauigkeit tun konnte.
Daher wurde heute Version 2 des Konverters zusammen mit Version 1 über Optionsfelder im Hauptformular veröffentlicht. Fühlen Sie sich frei, zu mischen und anzupassen, das gesamte Projekt mit einem zu konvertieren und dann einzelne Dateien mit dem anderen. Es ist zu hoffen, dass mit den beiden völlig unterschiedlichen Ansätzen einer der beiden besser funktioniert als der andere und weniger Arbeit verursacht. Auch hier liegt die Conversion bei beiden nur bei 80-90 %. Es gibt viele Dinge, die Sie manuell erledigen und noch einmal überprüfen müssen (z. B. Schleifengrenzen), aber auch hier ist es sicher besser, alle &
s in Ihrem VB6-Code in +
s für C# zu ändern.
Wie kann ich ...?
Es gibt viele Fragen, wenn es um die Konvertierung geht. Wenn Sie nur wissen möchten, wie dieser Konverter mit bestimmten Mustern umgeht, lesen Sie bitte den Abschnitt „Wie mache ich ...?“ Seite in unserem Wiki.
Unabhängig davon, ob Sie diesen Konverter verwenden oder nicht, bieten wir Ihnen eine Lösung für häufig auftretende Konvertierungsrätsel. Unsere Lösungen sind schnell, auf den Punkt gebracht und erfordern im Allgemeinen keinen großen Programmier- oder Kontextaufwand. Auch wenn sie sich möglicherweise auf unser Erweiterungsmodul verlassen, ist alles nativer C#-Code und im Allgemeinen ziemlich ähnlich zu dem, was Sie in VB6 gemacht haben.
Anforderungen
Konverteranforderungen
- Der Konverter läuft in der VB6-IDE. Sie wissen schon, die IDE des Programms, das Sie konvertieren möchten.
Konvertierte Programmanforderungen
- Visual Studio unterstützt eine relativ moderne Version von C#. Oder alternativ.
- Visual Basic Power Packs / Ein weiterer Link / Wird im Repo bereitgestellt, da es an manchen Tagen schwierig sein kann, sie zu finden
- Ermöglicht die Verwendung von Standard-VB-Funktionen wie
Mid
, Trim
, Abs
, DateDiff
usw. direkt im C#-Code. - Gewährleistet 99,9 % Kompatibilität mit der VB6-Funktionalität (außer
Format
...), ohne dass eine Black-Box-Bibliothek eines Drittanbieters erforderlich ist (sie stammt von MS, ist also eine Black-Box eines Erstanbieters). - Sobald es konvertiert und betriebsbereit ist, lässt es sich leicht iterieren.
Anweisungen
Weitere Informationen zur Verwendung finden Sie im Wiki.
Designüberlegungen
- Einfach – Nicht für eine 100-prozentige Konvertierung konzipiert. Nur vielleicht 80–90 % der Routinearbeit.
- VB6-basiert – Warum nicht? Sie benötigen ohnehin einen funktionierenden VB6-Compiler, wenn Sie VON vb6 konvertieren.
- Benutzerdefiniert – Dies wurde für ein persönliches Projekt erstellt und ist daher speziell auf unseren Anwendungsfall zugeschnitten. Aber es gibt keinen Grund, warum jemand nicht die Logik untersuchen und sie für seine eigenen Probleme optimieren könnte.
- Opportunistisch – Dieser Code basiert stark auf der relativen Einheitlichkeit der VB6-IDE:
- Der Abstand ist relativ konsistent, da die IDE ihn erzwingt.
- Die Großschreibung von Schlüsselwörtern kann garantiert werden.
- Wir nutzen die Microsoft Power Packs und müssen die meisten der VB6-Kernanweisungen NICHT konvertieren. Darüber hinaus können Sie weiterhin Anweisungen wie
DateDiff
, Left
und Trim
verwenden, wie Sie es in VB tun würden. Oder, wenn Sie es vorziehen, beginnen Sie NACH der Konvertierung mit der Abkehr von ihnen. Für maximale Kompatibilität beziehen wir einfach die Bibliothek von Microsoft ein und verfügen daher nicht über eine große Bibliothek zum Ersetzen von Zeichenfolgen. Wir verlassen uns auch nicht so stark auf unsere eigenen DLLs oder Bibliotheken wie einige Konverter (wir generieren einige zur Vereinfachung der Syntax, aber die Das Endergebnis ist reiner C#-Code).
- Nicht voraussetzend – Es wird davon ausgegangen, dass der Code in VB kompiliert wurde, es wird also nicht davon ausgegangen, dass Referenzen, die er nicht auflösen kann, nicht gefunden werden.
- Universelle Importe – Importiert JEDES Codemodul, genau wie VB6 es automatisch tat. Überlassen Sie Visual Studio die Entscheidung, welche verwendet werden sollen, indem Sie einfach die Importe nach der Konvertierung optimieren.
- C# 2017 – Dies ist ein Nachzügler. Es gab noch nie eine Freeware-Lösung für VB6 -> C#, und jetzt, wo VB.NET mehr oder weniger eingestellt ist, warum nicht?
Bekannte Probleme (nur Version 1)
- Derzeit sträubt sich der Konverter oft gegen eine Datei, die an einer beliebigen Stelle das Wort „Property“ enthält (außer in einer Eigenschaftsdeklaration). Dies ist zwar ein Problem und wird wahrscheinlich behoben, es wurde jedoch gegen Ende des Projektnutzens festgestellt (und steht daher nicht dringend auf der Reparaturliste) und dort, wo es den Fortschritt behinderte, wurde die Variable, die das Wort „...Eigenschaft“ enthielt, entfernt. wurde einfach vorübergehend in etwas wie „...Prppty“ umbenannt und dann in der konvertierten Datei wieder geändert.
- Dies wurde in Version 2 behoben, kann jedoch in einigen Fällen in Version 1 noch auftreten.
Nachteile
- Dadurch wird kein Code erzeugt, der in seiner generierten Form kompiliert werden kann. Die Automatisierung der letzten Meile ist einfach am teuersten und oft am besten manuell durchzuführen. Es erschien sinnvoller, etwas den größten Teil des Weges zu erledigen und alle Randfälle oder die endgültige Konvertierung von Hand abzuschließen.
- Begrenzte UI-Anpassung (aber unbegrenzte codebasierte Anpassung). Dies ist nicht die am besten anpassbare Lösung. Es sei denn natürlich, Sie möchten sich ein wenig mit dem Quellcode des Konverters befassen. Aber deshalb ist es verfügbar.
- Unlinierte Ausgabe. Der resultierende Code ist stilistisch ein Durcheinander. Dafür gibt es eine moderne IDE. Alle fehlerhaften Formatierungen können mit ^K^D bereinigt werden. Unbenutzte Importe mit ^K^E. Und es gibt viele zusätzliche {s und }s, die Sie wahrscheinlich löschen möchten.
- Der Konverter ist derzeit bei Schleifengrenzen WIRKLICH schlecht. Tut mir leid, das ist eine der Fallstricke einer VB6->C#-Konvertierung, und es gibt nicht viel Logik bei der Konvertierung. Es ist mühsam, aber führen Sie eine projektweite Suche nach allen for-Schleifen durch und überprüfen Sie die Grenzen manuell.
- Für jedes Ereignis gibt es eine zusätzliche Methode. Eine für die korrekte Unterschrift, eine für die Originalunterschrift. In den meisten Fällen ist die Redundanz unnötig, sie ermöglichte jedoch die einfachste Konvertierung. Diese lassen sich in den meisten Fällen auf eine einzige Methode reduzieren (aber nicht alle, weshalb ich das nicht tue).
HINWEIS: An den meisten Stellen, an denen der Konverter weiß, dass ein Problem vorliegt, wird er den Code mit einem // TODO:
-Kommentar versehen. Stellen Sie sicher, dass Sie sich mit jedem dieser Punkte gründlich befassen.
Pluspunkte
- Es ist kostenlos.
- Sie haben die Quelle (passen Sie sie an, was auch immer).
- Machen Sie das Ganze oder nur eine Datei nach der anderen.
- Es ist viel besser, als alles von Hand zu machen.
- Dadurch erhalten Sie einen guten Einblick in die Vorgänge, ohne dass Sie den gesamten manuellen Aufwand für eine einfache Konvertierung aufwenden müssen.
- Nicht die schnellste Konvertierung, aber eine unkomplizierte (aber Version 2 ist jetzt noch viel besser). Untersuchen Sie Funktionen wie
ConvertSub
oder ConvertPrototype
.- Aber denken Sie darüber nach ... Sie möchten die Konvertierung einmalig durchführen und nicht während der Konvertierungsausführung immer wieder ausführen.
- Ermöglicht die Überprüfung, wie etwas konvertiert wird. Gefällt Ihnen die Ausgabe nicht? Ändere es.
- Sie können einen VB6-Haltepunkt an einer beliebigen Stelle platzieren und anhalten. Fügen Sie außerdem einfach eine Zeile wie
If LineN = 387 Then Stop
, und der Konverter stoppt genau dort.
Extras
- Ein VB6-Code-Linter.
?Lint
. Beseitigen Sie möglichst viele technische Schulden, bevor Sie überhaupt mit dem Prozess beginnen. - VB6-Formular zu XAML
Zukünftige Möglichkeiten
Das Projekt ist weitgehend unverändert. Es funktioniert, was es tut. Ein paar Dinge, die Sie jedoch im Auge behalten sollten, sind Dinge wie „Erweiterungseigenschaften“. Wenn C# dies oder etwas Ähnliches jemals implementiert hat, wird die Konvertierung von .Visible = True
viel einfacher. Da C# jetzt eine Aufzählung anstelle eines booleschen Werts verwendet, ist dies nicht möglich, aber mit dieser Funktion wäre es möglich.
Kontakt
- Wenn Sie Fragen oder Bedenken haben oder einfach nur ein paar schnelle Hinweise wünschen, können Sie gerne ein Problem eröffnen. Ich kann nicht viel garantieren, aber ich versuche es!