Overview

DoQuBookCSharp - Présentation

Architecture de la solution :

* DoQuBookCSharp : Le projet contenant la bibliothèque.
* DoQuBookDaemon : le projet de DoQuBookDaemon : le lanceur de plugin.
* NUnit-2.5.10 : contient les dépendances nécessaires aux tests unitaires. 
* Plugins : contient les projets de plugins.
* Tests : L'ensemble des projets de tests.

À noter : la version Express de Visual Studio 2010 ne supporte pas les dossiers de solutions. Elle est affichée "à plat" : les projets contenus dans Plugins et Tests sont affichés comme enfants directs de la solution. Ce problème ne se produit pas avec les autres IDE que j'ai testé : MonoDevelop 3 et SharpDevelop 4.2

De manière générale, le répertoire de sortie de compilation est /bin/Debug ou /bin/Release du répertoire du projet concerné. Ex: DoQuBookDaemon.exe se situe dans ./DoQuBookCSharp/DoQuBookDaemon/bin/Debug ou Release.

Par défaut, les bibliothèques nécessaires au fonctionnement du projet sont exportées dans le même répertoire. Ex: DoQuBookDaemon est fournit avec la dll DoQuBookCSharp compilée soit en release soit en debug. Il est possible de préciser les bibliothèques a inclure en les rajoutant dans les Références du projet.

Création d'un plugin :

Il faut créer un nouveau projet du type "Bibliothèque c#" dans le répertoire Plugins. Les références obligatoires à ajouter sont DoQuBookCSharp et System. Il faut ensuite créer le plugin en lui-même : pour cela il faut créer une nouvelle classe héritant d'un des AlgrithmOnTask (Measurer, ImageFilter, Binarizer ...), de la même façon que dans la version c++.

Le constructeur doit être public et sans paramètres. Il faut surcharger les méthodes classiques : organisationName(), algorithmName(), version(), description(), et la méthode principale qui est measure(), binarize(), ocr(), etc ...

Les signatures de ces méthodes peuvent ne pas être les mêmes qu'en c++, notamment parce que les maps n'existent pas en c#. Par exemple la signature de measure est :

public Dictionary<string, double> measure ( List<Image> images, Dictionary<string, object> parameters )

Mais le fonctionnement global est strictement le même que celui des plugins c++.

Dernier point : il faut modifier le répertoire de sortie de compilation du plugin, via :

* sous MonoDevelop : clic droit sur le projet > Options > Construire > Sortie, sélectionner le path du répertoire de sortie pour chaque mode de configuration.
* sous SharpDevelop : clic droit sur le projet > Propriétés > Compilation > OutputPath
* sous VS2010 : clic droit sur le projet > Propriétés > Générer > Chemin de sortie

Pour le moment je fais pointer cette sortie vers le répertoire de DoQuBookDeamon, c-a-d vers ./DoQuBookCSharp/DoQuBookDaemon/bin/$(Configuration). Ces chemins sont stockués de façon relative. Je pense qu'à terme ce serait mieux de le faire dans un dossier de sortie dédié. Mais pour le moment le parsing de ligne de commande ne permet pas de préciser le répertoire de recherche pour le PluginLoader.

Création d'une App

Créer un nouveau projet vide. Rajouter les références DoQuBookCSharp, System et System.Windows.Form.

Pour les applications, il faut créer un point d'entrer, pour cela créer une classe MainClass héritant de DoQuBookApp.

Le constructeur de cette classe à pour signature :

public MainClass(string[] args, string orgName, string appName)

de plus, il doit faire appel au constructeur parent ayant la même signature : public MainClass(string[] args, string orgName, string appName): base(args, orgName, appName)

Pour créer un point d'entrer il faut là encore ajouter une méthode Main statique. Le lancement de DoQuBookApp se fait grâce à Application.Run(new MainClass(args, "myOrg", "myAppName")) appelé à la fin du Main. Les traitements relatifs à l'application, se font dans la méthode runApp(Arguments args) hérité de DoQuBookApp.

Les arguments supportés pour le moment sont -help ou --help et -repoName.

Il reste quelques points à résoudre : pour le moment je n'ai pas trouvé de moyen simple pour lancer un démon de façon compatible entre Win et Lin à la fois sous mono et .net donc pour le moment c'est une application console.