Navigatie

Welkom

Welkom, op deze website vindt u alle informatie over de masterproef "Migratiestrategieën van C++ naar C#".

Doel

Het doel van de masterproef is om een zo generiek mogelijke werkwijze te ontwikkelen om oude Visual C++ 6.0 projecten om te zetten naar Visual C# projecten.

Werkwijze

Het converteren van projecten in Visual C++ 6.0 naar Visual C# 2010 verloopt in verschillende stappen:

I. Converteren van Visual C++ 6.0 naar Visual C++ 2010

Het migreren van een project, gemaakt in Visual Studio 6.0, naar een compileerbaar project in Visual Studio 2010 is niet vanzelfsprekend. De eerste Visual C++ versies in 1998 waren niet compatibel met de C++ standaard. Men besefte bij Microsoft dat dit een grote hinderpaal was. Om Visual C++ te laten voldoen aan de C++ standaard zijn er daarom bij elke nieuwe versie een aantal wijzigingen aan de specificaties van Visual C++ aangebracht. Hierdoor zijn er telkens talloze, subtiele verschillen tussen de verschillende versies van Visual C++ die fouten in bestaande programma's kunnen veroorzaken. Deze fouten worden breaking changes genoemd.

const CHAR_MASK = 0xFF;	// VC++ 6.0
									
const int CHAR_MASK = 0xFF;	// VC++ 7.0 of hoger

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
Voorbeeld van een typische conversiefout.

Zo was het bijvoorbeeld in Visual C++ 6.0 nog niet verplicht om een type identifier op te geven indien het ging over een integer. Als de compiler geen type identifier vond, werd ervanuit gegaan dat het om een integer (int) ging. In latere versies van Visual C++ wordt dit beschouwd als een syntax error.

Het upgraden van een project naar een hogere versie van Visual C++ bestaat uit drie grote stappen:

1. Visual Studio Conversion Wizard

Het project wordt eerst in de versie van Visual Studio, geassocieerd met de gewenste versie van Visual C++, ingeladen. Visual Studio zal het project automatisch omzetten naar de projectstructuur van de Visual Studio doelversie. Zo zijn de (gegenereerde) projectbestanden compatibel met de gewenste doelversie. Deze aanpassingen hebben enkel invloed op de instellingen en bestandsstructuur van het project, niet op de code zelf.

2. iSE (iSolveEverything)

Hierna wordt het project geopend in iSE. iSE gebruikt de output van de commandline compiler van Visual Studio om fouten te detecteren. Via reguliere expressies analyseert iSE de foutinformatie en koppelt indien mogelijk de juiste oplossing aan de fout. De programmeur controleert de oplossingen aangeboden door iSE en bepaalt welke ervan doorgevoerd moeten worden. Zolang iSE fouten vindt, dient er gehercompileerd te worden met iSE. Bij het hercompileren geraakt de compiler telkens verder en kunnen er nieuwe fouten opduiken.

3. Manueel

Sommige fouten zijn niet programmatorisch op te lossen. Voorbeelden hiervan zijn: interacties met externe libraries, projectspecifieke eigenschappen, link errors, ... Deze fouten moeten manueel opgelost worden, aangezien de code zelf geen fouten bevat. Dit kan niet verwerkt worden met algoritmes, omdat deze fouten een oplossing vereisen waarbij gekeken wordt naar het doel en werking van het project.

II. Het combineren van Visual C++ 2010 en Visual C# deelprojecten via het omzetten van unmanaged naar managed code

Indien het project als managed Visual C++ wordt gecompileerd, dan kan men deelprojecten van verschillende .NET-talen, zoals Visual C++.NET en Visual C#, combineren. Het gebruik van managed Visual C++ heeft zowel voor- als nadelen. Het is ook mogelijk om, via Interop en COM, native Visual C++ en Visual C# projecten met elkaar te laten samenwerken. Op deze manier kan het project deel per deel omgezet worden naar Visual C#, om zo geleidelijk aan het gehele project om te zetten.

III. Converteren van Visual C++ 2010 naar Visual C#

#include 
int main(int argc, char **argv){
	std::cout << "Hello world!" << std::endl;
	return 0;
}

using System;
namespace HelloWorld
{
    class Hello
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello world!");
        }
    }
}

Voorbeeld van een mogelijke conversie (bovenaan C++, onderaan Visual C#).

Men heeft hier het onderscheid gemaakt tussen GUI en logica. Omdat GUI in Visual C# wordt verwezenlijkt via WPF of Windows Forms kunnen Visual C++ delen met MFC vervangen worden. De logica zelf moet dan nog worden geconverteerd naar Visual C#.

GUI

Hiervoor is de applicatie Rc2Form ontwikkelt. Rc2Form leest de resourcefiles (.rc) van Visual C++ projecten en converteert de daarin aanwezig structuren naar Windows Forms bestanden. Deze bestanden kunnen dan eenvoudig ingevoegd worden in Visual C# projecten.

Logica

De logica bleek zelf niet zo simpel of efficient te verwerken. Conversie zou niet een optimaal resultaat genereren. sowieso moet dan de gehele code nagekeken worden. Ook zijn de Visual C++ structuren niet de meest efficiƫnte structuren als basis voor de automatische conversie. Manueel kunnen er veel efficiƫntere en gestructureerde code genereert worden. Deze piste wordt op dit moment niet meer onderzocht.

Student: Martijn Saelens
Interne promotor: Leen Brouns
Externe promotor: Joris Van Maldeghem
Externe begeleider: Tom Eeraerts