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 :

Créer DLL en C puis l'utilisé sour sous Win CE en C#


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Créer DLL en C puis l'utilisé sour sous Win CE en C#
    Bonjour à tous,

    Je travail actuellement sur un projet sous Win CE 5.0 (Plateforme Colibri de chez Toradex)

    J'ai un programme de démo en C qui me permet de controler les GPIO de la carte, fourni par Toradex.
    Mon application globale est en C#, je cherche donc à créer une DLL pour utiliser les fonctions de ce controleur.

    Je travail sous VS2005. J'ai créé un projet Visual C++ --> Smart Device --> Projet Smart Device Win32 dans lequel j'ai spécifié que je voulais créer une DLL. Il m'a donc créé un projet avec stdafx.c/.h contenant les variable pour WinCE et le fichier principal du projet ByteBusDLL.c.

    J'ai importé les .c / .h de mon ancien projet. J'ai ajouté __declspec(dllexport) devant les fonctions. J'ai compilé ... aucun problème de compilation.


    Dans mon projet C#, j'utilise cette DLL en important les fonction comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [DllImport("ByteBusDLL.dll")]
    static extern unsafe void InitGPIO();
     
    [DllImport("ByteBusDLL.dll")]
    static extern unsafe void PutByteBus(uint dataBYTE); 
     
    ...

    Je compile ... mais lorsque je teste le programme, dès que j'appelle la fonction InitGPIO(); ... j'obtient l'erreur :




    Est ce que vous avez une idée d'où, cela peut venir ? Ai-je omis de faire quelque chose lors de la création de la DLL (j'ai lu les Tuto Interrop 1 et 2, j'ai essayé d'inclure Extern "C", mais VS2005 n'en veut pas) ?

    PS : Je peux fournir le code C si nécessaire ....

  2. #2
    Membre du Club Avatar de Yodabis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 55
    Points : 58
    Points
    58
    Par défaut
    Tu as essayé de lancer en important seulement une des deux ?

    Tu serais déjà fixé sur la communication entre les deux.

    Faut peut être vérifier le uint. entre C et C# c'est pas forcément le même nbre de bits.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En ce qui concerne la communication, elle fonctionne car j'ai créé une fonction C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Test(){
    	printf("Test !");
    }
    Lorsque je l'appelle du C#, cela fonctionne.


    En ce qui concerne le format des paramètres dans le C c'est un unsigned long, j'ai mis uint en C# .... mais je vais tester avec UInt32 ... je vous tient au courant.

    -- Edit

    Le changement de type n'y fait rien, en fait j'avais déjà changé.
    En fait, le programme plante lorsque j'appelle cette fonction :

    SetGPIODir(GPIO_GND, DIR_OUT);

    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
    /*
    gpioNum: GPIO Number
    dirOut: GPIO Direction [true:Output  false:Input]
    */
    void SetGPIODir(DWORD gpioNum, BOOL dirOut)
    {
    	DWORD lockID;
    	DWORD offset =0;
    	if(gpioNum>95)
    		offset =OFFSET_REG3;
     
    	lockID=LockAccess(0);
    	if(dirOut)
    		*(((DWORD*)&(pGPIOReg->gpdr0))+(gpioNum>>5)+offset)|= (1<<(gpioNum&31));
    	else
    		*(((DWORD*)&(pGPIOReg->gpdr0))+(gpioNum>>5)+offset)&= ~(1<<(gpioNum&31));
    	UnlockAccess(lockID);
    }
    où pGPIOReg est defini en global :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static GPIOREG * pGPIOReg = (GPIOREG*)GPIO_BASE;
    GPIOREG etant une structure :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    typedef volatile struct 
    {
        DWORD gplr0;	// Level Reg. Bank 0
        DWORD gplr1;	// Level Reg. Bank 1
        DWORD gplr2;	// Level Reg. Bank 2
        DWORD gpdr0;	// Direction Reg. Bank 0
        DWORD gpdr1;	// Direction Reg. Bank 1
        DWORD gpdr2;	// Direction Reg. Bank 2
        DWORD gpsr0;	// Output Set Reg. Bank 0
        DWORD gpsr1;	// Output Set Reg. Bank 1
        DWORD gpsr2;	// Output Set Reg. Bank 2
        DWORD gpcr0;	// Output Clr Reg. Bank 0
        DWORD gpcr1;	// Output Clr Reg. Bank 1
        DWORD gpcr2;	// Output Clr Reg. Bank 2
        DWORD grer0;	// Ris. Edge Detect Enable Reg. Bank 0
        DWORD grer1;	// Ris. Edge Detect Enable Reg. Bank 1
        DWORD grer2;	// Ris. Edge Detect Enable Reg. Bank 2
        DWORD gfer0;	// Fal. Edge Detect Enable Reg. Bank 0
        DWORD gfer1;	// Fal. Edge Detect Enable Reg. Bank 1
        DWORD gfer2;	// Fal. Edge Detect Enable Reg. Bank 2
        DWORD gedr0;	// Edge Detect Status Reg. Bank 0
        DWORD gedr1;	// Edge Detect Status Reg. Bank 1
        DWORD gedr2;	// Edge Detect Status Reg. Bank 2
        DWORD gafr0_l;	// Alt. Function Select Reg.[  0:15 ]
        DWORD gafr0_u;	// Alt. Function Select Reg.[ 16:31 ]
        DWORD gafr1_l;	// Alt. Function Select Reg.[ 32:47 ]
        DWORD gafr1_u;	// Alt. Function Select Reg.[ 48:63 ]
        DWORD gafr2_l;	// Alt. Function Select Reg.[ 64:79 ]
        DWORD gafr2_u;	// Alt. Function Select Reg.[ 80:95 ]
        DWORD gafr3_l;	// Alt. Function Select Reg.[ 96:111]
        DWORD gafr3_u;	// Alt. Function Select Reg.[112:120]
        DWORD res1[35];
        DWORD gplr3;	// Level Detect Reg. Bank 3
        DWORD res2[2];
        DWORD gpdr3;	// Data Direction Reg. Bank 3
        DWORD res3[2];
        DWORD gpsr3;	// Pin Output Set Reg. Bank 3
        DWORD res4[2];
        DWORD gpcr3;	// Pin Output Clr Reg. Bank 3
        DWORD res5[2];
        DWORD grer3;	// Ris. Edge Detect Enable Reg. Bank 3
        DWORD res6[2];
        DWORD gfer3;	// Fal. Edge Detect Enable Reg. Bank 3
        DWORD res7[2];
        DWORD gedr3;	// Edge Detect Status Reg. Bank 3
     
    } GPIOREG;

  4. #4
    Membre du Club Avatar de Yodabis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 55
    Points : 58
    Points
    58
    Par défaut
    Attention qu'il faut utiliser UInt32 si le DWORD était unsigned également, sinon c'est Int32...

    Vous disiez que la librairie C compile bien, mais l'avez-vous testé at runtime via une autre interface ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Le type DWORD est bien unsigned :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned long       DWORD;
    Vous disiez que la librairie C compile bien, mais l'avez-vous testé at runtime via une autre interface ?
    C'est à dire ? Un autre programme en C qui charge la librairie ?

  6. #6
    Membre du Club Avatar de Yodabis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 55
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par nebneb37 Voir le message
    C'est à dire ? Un autre programme en C qui charge la librairie ?
    Wep, je dis ça car il y a peut-être une erreur propre au C, que je suis très loin de maîtriser.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Au niveau du C, il n'y a pas de problème, j'ai un bout de code de test qui utilise les fonctions que j'ai inclus dans la librairie et il fonctionne bien.

    Je pencherais sur un problème de pointeur ou d'allocation mémoire, sur la structure qui est définie en globale, mais je ne sais pas trop comment m'en dépatouiller ...

    Je continu à explorer le pb, merci pour votre aide.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Pb création dll, projet similaire
    bonjour ,

    tout comme vous je dois développer une application sur une carte mère colibri intégrant le systeme windows CE. Pour cela je dois créer une DLL. J'ai les fichiers nécessaires mais je ne sais pas très bien comment m'y prendre malgré les nombreux essaye que j'ai tenté.
    Serait -il possible de me dire comment créer une DLL pour windows CE ?

    Merci

    salutations
    Cyril

Discussions similaires

  1. Créer un fichier texte puis demande de l'enregistrer
    Par kev42100 dans le forum Langage
    Réponses: 8
    Dernier message: 17/06/2008, 11h14
  2. créer DLL à partir code en VC++ (fichiers .h)
    Par punto dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 21/03/2008, 17h45
  3. créer DLL pour c# à partir code en VC++ (fichiers .h)
    Par punto dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/03/2008, 15h12
  4. Réponses: 1
    Dernier message: 07/07/2006, 15h49
  5. créer DLL
    Par stevo77 dans le forum Windows
    Réponses: 2
    Dernier message: 06/01/2006, 14h12

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