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