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++/CLI Discussion :

Appel d'une DLL en C# depuis un executable fortran


Sujet :

C++/CLI

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut Appel d'une DLL en C# depuis un executable fortran
    Bonjour,
    Je cherche à appeler une DLL en C# depuis un exécutable fortran.
    Pour se faire, j'utilise un code C++/CLI, avec une partie managée et une partie non managée, comme interface.

    J'ai d'abord créé un exécutable, avec une fonction main non managée, pour tester le bon fonctionnement du logiciel, et cela a marché correctement.

    Par contre, lorsque je compile le code comme une DLL, et que je l'appelle depuis un exécutable fortran, le code s'arrête au niveau de l'appel de le fonction manage.

    Je en comprend pas pourquoi.
    Voici le code incrimine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    void DllExport CREERXML(char* NOM_XTMP)
    {
    	char interXtmp[512];
    	string nom_fich_XTMP;
     
    // ici se trouve la conversion de char en string, avec /0 comme charactere
    //de fin
     
    	nom_fich_XTMP = interXtmp;
     
    //passage dans la partie manage
    	CREERXMLmanage(nom_fich_XTMP);
    }
     
    #pragma managed (push,on)
    //appel de le dll C#
    void CREERXMLmanage(string nomFichier)
    {
    	//conversion du string en String^
    	String ^ nomFichierManage = gcnew String(nomFichier.c_str());
     
            //appel de la fonction C# proprement dite
     	remplirSbael::miseEnPlaceSortie(nomFichierManage);
    }
    Et le code C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    namespace ecrireXML
    {
     
        /// <summary>
        /// Classe principale
        /// </summary>
        public static class remplirSbael
        {
            /// <summary>
            /// La fonction principale
            /// </summary>
            /// <returns></returns>
            public static void miseEnPlaceSortie(string args)
           {
            //ici, le code en C# faisant le traitement que je dois effectuer
            }
    Merci d'avance pour votre aide

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Bonjour, merci pour la réponse.
    Malheureusement même en mangeant beaucoup de haricots ça marche pas

    Justement. Le fortran ne peut pas être managé au sens microsoft (c'est à dire exécuté sur la machine virtuelle), et ma DLL est en code managé (puisqu'en C#). C'est pour ça que je me sers du C++ pour interfacer la partie non-managée et la partie managée.
    Ce que je ne comprend pas c'est pourquoi tout fonctionne bien tant que mon code C++ est compilé comme un exécutable et pourquoi çà ne marche pas quand il est compilé comme une dll et appellé depuis le fortran.

    Par contre je me rend compte que dans l'exemple que je donne j'ai oublié la balise #pragma unmanaged. La partie en C++ donne donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    # pragma unmanaged
    void DllExport CREERXML(char* NOM_XTMP)
    {
    	char interXtmp[512];
    	string nom_fich_XTMP;
     
    // ici se trouve la conversion de char en string, avec /0 comme charactere
    //de fin
     
    	nom_fich_XTMP = interXtmp;
     
    //passage dans la partie manage
    	CREERXMLmanage(nom_fich_XTMP);
    }
     
    #pragma managed (push,on)
    //appel de le dll C#
    void CREERXMLmanage(string nomFichier)
    {
    	//conversion du string en String^
    	String ^ nomFichierManage = gcnew String(nomFichier.c_str());
     
            //appel de la fonction C# proprement dite
     	remplirSbael::miseEnPlaceSortie(nomFichierManage);
    }
    L'ensemble du code est compilé avec la balise /clr (donc prise en charge du command language runtime sauf instruction de préprocesseur contraire).

    Sinon j'ai trouvé pleins de choses pour appeler une dll non managée (directement exécutée par le processeur) avec un code managé (exécuté sur la machine virtuelle).

    Cordialement

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut FACILE
    Me revoila,

    Et oui je suis l'homme invisible.
    Plus sérieusement, il suffit juste de réecrire le fortran en C++

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Ben c'est vachement util pour cambrioler les banques d'etre invisible


    Plus sérieusement, j'y ai pensé mais malheureusement c'est un très gros programme fortran. Il serait presque plus simple de réécrire la dll en fortran

    Et surtout le problème de la liaison de dell .NET à des exécutables fortran va se poser pour tous les autres programmes écrit en fortran que nous possédons.
    Mais merci quand même

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut FACILE
    OK,

    Bon passons aux choses sérieuses.
    CE qu'il faut faire:
    As tu bien choisi les settings concernant la compilation?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut FACILE
    Quelles settings utilisent tu?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Dans référence, j'ai désigné la dll C#.
    La configuration est dll. Pour les MFC, j'utilise les bibliothèques windows standard.
    Pas d'ATL
    Pas d'optimisation.
    Prise en charge du common language runtime activée


    Il n'y a ni erreurs ni warnings.
    Voici la ligne de commande utilisée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    Lignes de commande      Création du fichier temporaire "d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000001924480.rsp" avec pour contenu
    [
    /Od /D "WIN32" /D "_DEBUG" /D "_WINDLL" /D "_UNICODE" /D "UNICODE" /FD /MDd /Yu"stdafx.h" /Fp"./debug/obj\interfaceXML.pch" /Fo"./debug/obj\\" /Fd"./debug/obj\vc80.pdb" /W4 /c /Zi /clr /TP /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll" /FU "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.XML.dll" /FU "d:\xcct\dll\ecrireXML.exe"
     
    ".\interfaceXML.cpp"
    ]
    Création de la ligne de commande "cl.exe @"d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000001924480.rsp" /nologo"
    Création du fichier temporaire "d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000002924480.rsp" avec pour contenu
    [
    /OUT:"..\..\..\..\xcct\dll\interfaceXML.dll" /INCREMENTAL /DLL /MANIFEST /MANIFESTFILE:"./debug/obj\interfaceXML.dll.intermediate.manifest" /DEBUG /PDB:"d:\xcct\dll\interfaceXML.pdb" /IMPLIB:"..\..\..\..\xcct\lib\interfaceXML.lib" /MACHINE:X86 /CLRUNMANAGEDCODECHECK
     
    ".\Debug\obj\app.res"
     
    ".\Debug\obj\interfaceXML.obj"
     
    ".\Debug\obj\Stdafx.obj"
    ]
    Création de la ligne de commande "link.exe @"d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000002924480.rsp" /NOLOGO /ERRORREPORT:PROMPT"
    Création du fichier temporaire "d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000003924480.rsp" avec pour contenu
    [
    /outputresource:"..\..\..\..\xcct\dll\interfaceXML.dll;#2" /manifest
     
    ".\Debug\obj\interfaceXML.dll.intermediate.manifest"
    ]
    Création de la ligne de commande "mt.exe @"d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\RSP000003924480.rsp" /nologo"
    Création du fichier temporaire "d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\BAT000004924480.bat" avec pour contenu
    [
    @echo La ressource de manifeste a été mise à jour pour la dernière fois à %TIME% le %DATE% > ".\Debug\obj\mt.dep"
    ]
    Création de la ligne de commande """d:\donnees\xmlC#\interfaceXML\interfaceXML\debug\obj\BAT000004924480.bat"""
    Et la sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fenêtre Sortie      Compilation en cours...
    interfaceXML.cpp
    Édition des liens en cours...
       Création de la bibliothèque ..\..\..\..\xcct\lib\interfaceXML.lib et de l'objet ..\..\..\..\xcct\lib\interfaceXML.exp
    Incorporation du manifeste en cours...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 5
    Par défaut FACILE
    dsl,

    Je ne suis pas assez compétent...

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Pas grave
    Merci quand même

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 10
    Par défaut
    Bonjour

    Merci de votre aide.
    J'ai finalement trouvé d'où venait le problème.
    Lorsque je compile mon code fortran, j'utilise Compaq Visual Fortran 6 qui ne gère pas les assemblages.
    Cela marchait avec lorsque j'utilisais un exécutable C++, car je compilais averc Visual Studio 2005, en mettant les références adéquates.
    Il fallait donc que je place la DLL C# dans le répertoire de l'exécutable obtenu en fortran.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. appel d'une fonction utilisant Opencv depuis une dll c++
    Par manoulaisamm dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 06/03/2014, 13h43
  2. Erreur lors de l'appel d'une DLL en C depuis Java
    Par rinuom dans le forum Général Java
    Réponses: 1
    Dernier message: 30/04/2012, 19h23
  3. Appel d'une dll C depuis du code Python
    Par gnayoke dans le forum Général Python
    Réponses: 7
    Dernier message: 18/02/2010, 14h26
  4. Appel d'une DLL C depuis VB
    Par oliver_mpt dans le forum Windows
    Réponses: 6
    Dernier message: 13/06/2008, 14h40
  5. Appel d'une boite de dialogue depuis une dll
    Par fumidu dans le forum Visual C++
    Réponses: 11
    Dernier message: 25/09/2007, 10h28

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