Inhaltsverzeichnis

Diese Seite ist noch in Bearbeitung. Die Informationen auf dieser Seite sind deshalb unvollständig und nicht verbindlich.

Migration vollständiger Programme von COBOL nach C#

Die Migration von Cobol-Programmen nach C# erfolgt mit dem Werkzeug ExpEdge.

Das für die Migration verwendete Generierungsszenario heißt cob-cs. Dieses ist im ExpEdge-Aufruf mit der Option -gen anzugeben.

Die Angabe der zu migrierenden Cobol-Sources erfolgt als Eingabedatei vom Typ COBL1) (für Programme) bzw. COBC2) (für CopyBooks mit Konstanten), COBS3) (für modifizierbare CopyBooks ) z.B.

 PRIVAT.COBC."K:\Src\rewt\cpy\CXSND100.cpy"
 PRIVAT.COBS."K:\Src\rewt\cpy\CXSND650.cpy"
 PRIVAT.COBL."K:\SRC\REWT\PRIVAT\MODULE\CP85\Z0SNU7F3.CBL"

Alternativ kann auch der Baustein angegeben werden:

 PRIVAT.EFUN.AF-BERECHNUNG-JP

ExpEdge sucht zum COBOL-Programm die zugehörige Schnittstellendefinition oder zum TAA-Modul die aktuell vorhandene COBOL-Implementierung.

Falls der Baustein angeben wird, werden der Verzeichnisname und der Modulname für die Cobol-Implementierung abgeleitet aus der Ispc-Angabe für das Modul sowie, falls der EDB-Zugriff erlaubt ist (SearchOrder > 0), der Konfig-Angabe „VssVerzeichnis“. Die Infos werden zusammengesetzt lt. Angabe in config/SourcePath in der TAA-Registry, Default „K:\\Src\\$V\\edb\\$A\\Module\\$D\\$I.$S“. Hierbei steht $D für den Verzeichnisnamen, die anderen Platzhalter entsprechen den in der mdb verwendeten Platzhaltern.

ExpEdge erzeugt für jede Quelle eine oder mehrere passende C#-Dateien sowie alle notwendigen Komponenten, um die erzeugten Code-Komponenten in eine C#-Assembly zu bündeln. Die Erstellung der Komponenten für die Erstellung einer Assembly kann mit der ExpEdge-Generator-Einstellung CreateProject=false unterdrückt werden. Die Assembly wird unter dem mit der Option -proj angegebenen Projektnamen in dem mit der Option -o angegebenen Pfad mit der mit -rns angegebenen Namespace erzeugt (zu den Optionen vgl. Generierung einer Assembly). Falls bei einer der zu migrierenden Komponenten die Option main=true gesetzt ist, wird diese Komponente als Einstieg für ein ausführbares Programm angesehen und wird die Assembly als ausführbares Programm (EXE) erzeugt. Sonst wird die Assembly als Klassenbibliothek (DLL) angelegt.

Folgende Komponenten werden4) für die Assembly erzeugt:

Migration eines TAA-Moduls

Wenn ein TAA-Modul mit ExpEdge migriert wird, basiert die erzeugte C#-Implementierung auf der Basisklasse des Moduls, die von ExpEdge anhand der Modulschnittstelle erzeugt wird. Das bedeutet, dass diese Basisklasse zunächst in einer sogenannten Basis-Assembly zur Verfügung gestellt werden muss (→ Generierung einer Basis-Assembly).

Der Name der Basis-Assembly ist im ExpEdge-Aufruf anzugeben, z.B.

-opt baseassembly=c:\t\CP82\bin\Release\ALSNCP82.dll

Optimierung

ExpEdge bietet die Möglichkeit, einmalig aufgerufene Methoden mit einer festlegbaren Anzahl an C#-Codezeilen inline zu generieren.6) Standardmäßig ist der Wert 3, kann vom Nutzer aber angepasst werden:

-opt "inlineThreshold=3"

Vorher

…
E1501AfAusstGrndPraemie();
...
 
// E 1 5 0 1 A f A u s s t G r n d P r a e m i e
// ---------------------------------------------
// ORIG: E15-01-AF-AUSST-GRND-PRAEMIE
private void E1501AfAusstGrndPraemie()
{
   // -------------------------------------------------------------
   // 
   //     AUSSTEUERUNGSGRUENDE PRAEMIE (VORERST NUR IN SACH PRIVAT)
   // ORIG: EXEC TAA
   // ORIG:     CALL EFUN SERVICE AF-AUSST-GRND
   // ORIG:     IN PRIVAT.PRUEF-PME
   // ORIG:     WITH LSNPME2 = LSNPME2
   // ORIG:     AND  SIGABTS = SIGABTS
   // ORIG:     AND  SNLVMI  = SNLVMI
   // ORIG:     AND  SNLPPME = SNLPPME
   // ORIG:     AND  Z0AAIVB = Z0AAIVB
   // ORIG:     AND  Z0AAPME = Z0AAPME
   // ORIG:     AND  SVLPPME = SVLPPME
   // ORIG:     AND  Z0AALUF = Z0AALUF
   // ORIG: END-EXEC
   this.Call.AfAusstGrnd.PruefPme.AssignMatchingArguments();
   LastCall.AfAusstGrndState = this.Call.AfAusstGrnd.PruefPme.Run();
   // ORIG: EXIT
}

Inline

// MIG_NOTE: Inline E1501AfAusstGrndPraemie();
// E 1 5 0 1 A f A u s s t G r n d P r a e m i e
// ---------------------------------------------
// -------------------------------------------------------------
// 
//     AUSSTEUERUNGSGRUENDE PRAEMIE (VORERST NUR IN SACH PRIVAT)
// ORIG: EXEC TAA
// ORIG:     CALL EFUN SERVICE AF-AUSST-GRND
// ORIG:     IN PRIVAT.PRUEF-PME
// ORIG:     WITH LSNPME2 = LSNPME2
// ORIG:     AND  SIGABTS = SIGABTS
// ORIG:     AND  SNLVMI  = SNLVMI
// ORIG:     AND  SNLPPME = SNLPPME
// ORIG:     AND  Z0AAIVB = Z0AAIVB
// ORIG:     AND  Z0AAPME = Z0AAPME
// ORIG:     AND  SVLPPME = SVLPPME
// ORIG:     AND  Z0AALUF = Z0AALUF
// ORIG: END-EXEC
this.Call.AfAusstGrnd.PruefPme.AssignMatchingArguments();
LastCall.AfAusstGrndState = this.Call.AfAusstGrnd.PruefPme.Run();
// ORIG: EXIT

Beispiel für eine ExpEdge-Eingabe

cob-cs.rsp
# ---------------
# general options
# ---------------
-gen cob-cs
-lo cob-cs.log
-a PRIVAT
-s REWT 
-srch 0
-n ALSNCP85Cs
-o D:\work\test\CP85Cs_
-v 085 
-c AL 
-rns AL.PrivatPraemienBerechnungCs
-proj AL.PrivatPraemienBerechnungCs
-m TargetFrameworkVersion=v4.5 
-opt baseassembly=c:\t\CP82\bin\Release\ALSNCP82.dll
-opt basenamespace=AL.PrivatPraemienBerechnung
 
# ------------------------
# global copies and consts
#-------------------------
PRIVAT.COBC."K:\Src\rewt\cpy\CXSND100.cpy"
PRIVAT.COBC."K:\Src\rewt\cpy\CXSND200.cpy"
 
# -------
# modules 
# -------
PRIVAT.COBL."K:\SRC\REWT\PRIVAT\MODULE\CP85\Z0SNU7F3.CBL"
PRIVAT.COBL."K:\SRC\REWT\PRIVAT\MODULE\CP85\Z0SNU4J8.CBL"

Struktur des erzeugten C#-Projekts

Die erzeugte Projektdatei enthält

1)
ehemals COBOL
2)
ehemals COBCONST
3)
ehemals COBSTRUCT
4)
optional - siehe die ExpEdge-Generator-Einstellung CreateProject
5)
ExpEdge Commandline Option projconfig
6)
v9.10