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

  1. #1
    Membre à l'essai
    Conserver une référence d'une dll c++ native jusqu'à couche C#
    Bonjour à tous,
    Je vais essayer d'être le plus clair possible.
    J'ai écris une DLL native qui contient 1 méthode effectuant tout un tas de calcul. jusque la tout va bien.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    double SpectralPropertySoil(double slope, double snow,double snowage, double IN_thetas, double thetassat, double &OUT_reflvs, double &OUT_reflns,double ksnow, double reflvsground, double reflvssnowfresh, double reflvssnowold,double reflnsdry, double reflnsmoist, double reflnssnowfresh, double reflnssnowold) { some calculations...}


    Notez les 2 références que je souhaite récupérer en C# !
    J'ai donc rajouté un projet C++/CLI dans lequel je référence cette DLL native et je "wrapp" cette fonction dans une public ref class comme ceci :
    Le fichier.h:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    double SpectralPropertySoilWrapped( double slope, double snow,double snowage, double IN_thetas, double thetassat, double %OUT_reflvs, double %OUT_reflns,double ksnow, double reflvsground, double reflvssnowfresh, double reflvssnowold,double reflnsdry, double reflnsmoist, double reflnssnowfresh, double reflnssnowold);


    Le fichier.cpp:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double CompleteWrapper::SpectralPropertySoilWrapped( double slope, double snow,
    double snowage, double IN_thetas, double thetassat, double %OUT_reflvs, double %OUT_reflns,
    double ksnow, double reflvsground, double reflvssnowfresh, double reflvssnowold,
    double reflnsdry, double reflnsmoist, double reflnssnowfresh, double reflnssnowold)
    {	return PasimWrapper::SpectralPropertySoil(slope,  snow, snowage, IN_thetas, thetassat, OUT_reflvs,OUT_reflns, ksnow, reflvsground, reflvssnowfresh, reflvssnowold, reflnsdry, reflnsmoist, reflnssnowfresh, reflnssnowold);


    A ce niveau j'ai une erreur qui me dit : the % operator can be used only on an object with a managed class type.

    et enfin mon projet C# qui utilise cette DLL. Le tout fonctionne à peu près bien car je n'arrive pas à récupérer les 2 valeurs référencées en natif (&). J'ai essayé des choses avec des pointeurs, des tracking reference, etc...mais je crois que j'ai besoin d'un oeil extérieur maintenant. Les valeurs sont conservées jusqu'à la couche C++/CLI et au moment ou le programme retourne dans le C# les références sont perdues.
    Auriez vous une piste ? une indication ? ou peut être je fais mal les choses avec mon code ?
    Dites moi car la je dois dire que je suis à cours d'idées.
    Merci !
    @pluche

  2. #2
    Expert éminent sénior
    J'ai bien peur que tu aies besoin de faire un wrapper légèrement plus élaboré, qui travaille sur des copies des variables, plutôt que les variables elles-mêmes:
    Code C++/CLI :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double CompleteWrapper::SpectralPropertySoilWrapped( double slope, double snow,
    	double snowage, double IN_thetas, double thetassat, double %OUT_reflvs, double %OUT_reflns,
    	double ksnow, double reflvsground, double reflvssnowfresh, double reflvssnowold,
    	double reflnsdry, double reflnsmoist, double reflnssnowfresh, double reflnssnowold)
    {
    	double copy_reflvs = OUT_reflvs;
    	double copy_reflns = OUT_reflns;
    	double ret = PasimWrapper::SpectralPropertySoil(slope, snow, snowage, IN_thetas, thetassat, copy_reflvs, copy_reflns, ksnow, reflvsground, reflvssnowfresh, reflvssnowold, reflnsdry, reflnsmoist, reflnssnowfresh, reflnssnowold);
    	OUT_reflvs = copy_reflvs;
    	OUT_reflns = copy_reflns;
    	return ret;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Citation Envoyé par Médinoc Voir le message
    J'ai bien peur que tu aies besoin de faire un wrapper légèrement plus élaboré, qui travaille sur des copies des variables, plutôt que les variables elles-mêmes:
    Code C++/CLI :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double CompleteWrapper::SpectralPropertySoilWrapped( double slope, double snow,
    	double snowage, double IN_thetas, double thetassat, double %OUT_reflvs, double %OUT_reflns,
    	double ksnow, double reflvsground, double reflvssnowfresh, double reflvssnowold,
    	double reflnsdry, double reflnsmoist, double reflnssnowfresh, double reflnssnowold)
    {
    	double copy_reflvs = OUT_reflvs;
    	double copy_reflns = OUT_reflns;
    	double ret = PasimWrapper::SpectralPropertySoil(slope, snow, snowage, IN_thetas, thetassat, copy_reflvs, copy_reflns, ksnow, reflvsground, reflvssnowfresh, reflvssnowold, reflnsdry, reflnsmoist, reflnssnowfresh, reflnssnowold);
    	OUT_reflvs = copy_reflvs;
    	OUT_reflns = copy_reflns;
    	return ret;
    }
    Bon ben quoi dire de plus si ce n'est un grand merci !
    Un œil extérieur est toujours le bienvenu.

    nono

  4. #4
    Expert éminent sénior
    Remarques à 2 balles :
    - des références dans une signature -> Une API C++ et plus C -> Une API toute pourrie qui ne supportera qu'un type de compilateur.
    - Vous avez beaucoup de paramètres, pourquoi ne pas les regroupés dans des structures (en C cf. ma 1ère remarque à 2 balles).