IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Code adaptatif selon les versions


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Code adaptatif selon les versions
    Bonjour tout le monde !

    Je m’appelle Paul et j’ai besoin d'un peu d'aide vis à vis du C#!

    contexte : Je travaille dans le milieu médical en tant que physicien médical, j'utilise les accélérateur d'électrons (LINAC) et il est possible dans notre système d'utiliser le C# afin d'optimiser X choses . Le C# est fondu dans notre interface du "TPS" (Treatment Planning System) donc il y a des fonctions propre à cet éco système... Mais voilà, j'essaie de faire un code qui peut être utile à la plupart des centres de radiothérapie mais le problème est que nous n'avons pas tous la même version du TPS, certaines expressions sont différentes...

    exemple :
    Pour avoir la dose délivrée par fraction je fais

    Version 13
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Dose = context.externalBeamPlanning.PlanSetup.UniqueFractionnation.DosePerFraction;
    Version 15
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Dose = context.externalBeamPlanning.PlanSetup.DosePerFraction;

    Bien-sur si je pose une condition si V= 13 ou V=15, au moment de compiler il me dit que l'une ou l'autre expression n'existe pas dans la bibliothèque....
    Savez-vous s'il est possible de créer un string du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    si V13
        string DoseVersion = "UniqueFractionnation.DosePerFraction"
    si V15
        string DoseVersion = "DosePerFraction"
    et ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Dose = context.externalBeamPlanning.PlanSetup.DoseVersion;
    Je suis ouvert à toutes autres possibilités !

    Merci beaucoup de votre aide !

    Paul

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je pense qu'il faut faire 2 dlls et charger la bonne selon la version
    pour ca il existe l'injection de dépendance avec des framework tout fait
    sinon ca peut se faire à la main facilement si on a quelques concepts en tête comme le design pattern factory et l'héritage, et après c'est appdomain.load pour charger une dll
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Alors, je vois plusieurs possibilité, chacune avec des avantages / inconvénients.

    La première, c'est d'utiliser la réflexion pour récupérer les bonnes valeurs. En fonction de la version, tu utilises ainsi des noms différents. C'est un peu chiant à mettre en place (nécessite pas mal de code), mais permet d'avoir une seule DLL qui fasse tout le boulot.

    La seconde, c'est d'utiliser une variable de type dynamic. Par exemple, tu fais un dynamic planSetup = context.externalBeamPlanning.PlanSetup. Normalement, le compilateur devrait autoriser ensuite l'usage de membres, même s'il n'existe pas (par contre, le programme crachera à l'exécution si une méthode n'existe pas). On perd le typage statique, mais c'est plus simple à mettre en oeuvre que la réflexion et permet d'avoir une seule DLL. Mais il faut au minimum un C# 4.

    La troisième, c'est de définir des "symboles de compilation conditionnelle", pour pouvoir faire ensuite du code comme:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if VER_15
        Console.WriteLine("Version 15");
    #endif
    C'est assez simple à mettre en oeuvre, mais cela nécessite de définir des variables à la compilation, et surtout génère autant de DLL qu'il y a de versions différentes.

    Et il y a en plus la méthode d'injection de dépendance proposée par Pol63.

    Quoi qu'il en soit, je te suggère fortement de faire un Wrapper pour tes TPS. C'est ton wrapper qui fera le nécessaire en fonction de la version du logiciel. Ton programme lui, n'aura plus qu'à l'utiliser sans se soucier de quoi que ce soit. Par exemple, ton wrapper définit une propriété DosePerFraction, et c'est à la charge ensuite à ton wrapper de récupérer cette valeur en fonction de la version installée.

    Ainsi, en cas de changement de version, ou d'une nouvelle version, tu n'auras que le wrapper à mettre à jour.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !

    Mes connaissances en C# sont toutes nouvelles et j'ai appris sur le tas en décryptant des scripts donc la méthode qui me parle le plus est celle de l'utilisation des dynamics que je vais essayer !
    Pour le moment nous utilisons 2 Dll, mais c'est un peu chiant car quand je fais une amélioration (et il y en a vu que j'en apprend de jours en jours), je dois le faire sur les deux et j'ai peur que finalement cela entraîne une erreur.
    Donc je pars pour le moment sur les dynamics en blindant le code histoire de pas avoir de crash et si ca marche pas je vais partir sur les autres solutions (qui pour le moment sont du chinois pour moi ).

    Merci beaucoup !

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Une autre option pour éviter la duplication de code est d'utiliser un projet partagé. En gros il y aura deux projets de dll, un pour chaque version du TPS, plus une troisième projet contenant tout le code en commun et référencé par les deux premiers projets. Au moment de la compilation des projets de dll tout le code du projet partagé sera traité comme s'il faisait partie du projet compilé.

    C'est une options de Visual Studio très utile pour réaliser deux implémentations d'une même fonctionnalité en fonction de la plateforme à cibler, sans avoir à écrire deux fois la même chose. Par exemple on peut faire deux versions d'une dll, l'une ciblant le .Net Framework, et l'autre le Framework Net Core, ou bien l'une ciblant une ancienne version du Framework et l'autre une version récente en utilisant des fonctionnalités qui ne sont disponibles qu'à partir de cette version.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 149
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Pour reporter facilement des modification d'un projet dans un autre, tu peux aussi passer par le gestionnaire de source (GIT notamment) et faire une branche.
    Il est alors possible simplement de récupérer dans la branche "V15" les modifications apportées dans la branche "V13".
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/03/2018, 17h12
  2. Réponses: 4
    Dernier message: 25/08/2014, 12h45
  3. datetime via SQL server et traitement PHP different selon les versions
    Par Centrallatice dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 03/01/2014, 10h48
  4. Réponses: 7
    Dernier message: 15/02/2010, 21h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo