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 :

Path Dll mobile dans Dllimport [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut Path Dll mobile dans Dllimport
    Bonjour à tous,

    J'ai un petit problème sur un programme que je n'arrive pas à résoudre à propos de la fonction Dllimport. En deux mots : Mon programme en C# doit aller chercher une Dll non managée en C++ pour utiliser les fonctions de la Dll.
    Jusque la tout fonctionne. Mais ce programme est fait pour être mobile.
    Sur ma clef, j'ai copier le fichier .exe et la Dll. Ces fichiers seront ensuite copier sur l'ordinateur de la personne qui souhaite utiliser l'application. Donc les adresses "path" de la Dll changerons tous les 4 matins.

    exemple de ma fonctions Dll import (fonctionne correctement) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    [DllImport("C:/exemple.dll",
                    CharSet = CharSet.Auto,
                    CallingConvention = CallingConvention.Cdecl)]
                [return: MarshalAs(UnmanagedType.I4)]
                public static extern Int32 F_FonctionDll(Int32 no);
    Maintenant j'aimerais pouvoir remplacer le lien : "C:/exemple.exe" par un chemin automatique. Donc j'ai trouvé la fonction : Application.StartupPat
    (qui me permet d'obtenir le path de mon fichier exécutable:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    String adress = Application.StartupPath;        // Me donne tous le chemin     jusqu'au dossier de l’exécutable sans le nom de l'exe. 
    System.Type type = Application.StartupPath.GetType();
     
                [DllImport(adress + "maDll.dll", // visual ne veut rien entendre ca ne marche pas.... :-(
                    CharSet = CharSet.Auto,
                    CallingConvention = CallingConvention.Cdecl)]
                [return: MarshalAs(UnmanagedType.I4)]
                public static extern Int32 F_FonctionDll(Int32 no);


    Mais la, ça ne fonctionne pas. Mes compétences étant réduite, je n'arrive pas à trouver de réelle solution pour que ça fonctionne, quelqu'un pourrait m'aider??

    Cordialement , Clément

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Il est tout à fait normal que cela ne marche pas : en effet le cycle de vie des instances des classes "Attribute" est totalement décorrélé du cycle de vie des instances normale et du cycle de vie des initialiseurs statiques.

    Donc, il n'y a pas moyen de s'assurer que la variable adress soit initialisée au moment de l'instanciation de la classe DllImportAttribute (qui est instancié uniquement quand un appel à GetCustomAttribute est fait).

    Comme il est impossible de s'assurer de cette initialisation, le compilateur, dans sa grande sagesse, t'envoie bouler

    Tu ne peux mettre que des constantes dans la déclaration DllImport.

    La seule solution envisageable ici est d'ajouter dynamiquement le répertoire au PATH de l'environnement.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Merci pour l'explication.
    Je vais faire mes petites recherches pour apprendre à ajouter dynamiquement le répertoire au PATH de l'environnement.
    Merci. Cordialement, Clément

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Environment.SetEnvironmentVariable

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu n'as pas besoin de spécifier le répertoire si ta dll est au même endroit que ton application ou dans le dossier (système 32)
    chez moi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [System.Runtime.InteropServices.DllImport("Functions.dll")]
            static extern void fnPostMessage(IntPtr process,Int32 nb,Int32 key,Int32 type);
    fonctionne très bien

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    tu n'as pas besoin de spécifier le répertoire si ta dll est au même endroit que ton application
    Seulement si le repertoire courant est le répertoire de l'application au lancement, sauf erreur de ma part.

    Pour le répertoire System32, c'est normal, car il est par défaut dans la liste des PATH secondaires.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Alors si je n'indique pas l'emplacement de la Dll j'ai le message :
    Impossible de charger la DLL 'MSP430FPA.dll': Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)
    qui apparait.

    Le seul moyen de rectifier le problème simplement est d'entrer le chemin entier de la Dll.

    C'est une Dll qui me permet de contrôler un microprocesseur donc qui n'a pas une utilisation très courante car la marque propose des utilitaires qui font la même chose.

    Donc j’essaie de résoudre le problème avec "Environment.SetEnvironmentVariable" mais bon vu que je débute dans la prog. je suis obliger de lire plusieurs tutoriels pour comprendre ce qu'est ajouter dynamiquement une instance. Ce qui me prend pas mal de temps d’ailleurs.

    En lisant je vois qu'on peut aussi utiliser le Typeof. Pourriez-vous m'expliquer si vous avez deux minutes? Car de ce que je lit ça serait plus pour obtenir la nature d'un type. J'ai peut être mal compris..

    Merci pour votre aide, Clément

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    la dll 'MSP430FPA.dll' est la dll que tu as dans ton dllimport?

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    oui.

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu l'a mis dans le même répertoire que ton application ou un sous répertoire?

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Je les aient placé dans le même répertoire et d'ailleurs il n'y a que c'est deux fichiers dans le dossier.

    Edit
    Je suis en train de lire un message sur le forum où ils disent qu'on peut utiliser la GAC pour donner le chemin des Dll, est ce que ça vaut le coup que je creuse un peu sur cette voie là?

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    bizarre tout ça et si tu met juste ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport("MSP430FPA.dll")]            
                public static extern Int32 F_FonctionDll(Int32 no);

  13. #13
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par cdumargu Voir le message
    Donc j’essaie de résoudre le problème avec "Environment.SetEnvironmentVariable" mais bon vu que je débute dans la prog. je suis obliger de lire plusieurs tutoriels pour comprendre ce qu'est ajouter dynamiquement une instance. Ce qui me prend pas mal de temps d’ailleurs.
    Avec SetEnvironmentVariable tu n'as pas besoin de cela normalement.
    Il suffit d'écrire une méthode de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private static void AddPathToEnvPath(string pathToAdd)
    {
    	const string pathEnvVariable = "PATH";
    	string envPath = Environment.GetEnvironmentVariable(pathEnvVariable);
    	Environment.SetEnvironmentVariable(pathEnvVariable, envPath + ";" + pathToAdd);
    }
    pour ajouter le path de ta DLL aux path existant.


    En lisant je vois qu'on peut aussi utiliser le Typeof. Pourriez-vous m'expliquer si vous avez deux minutes? Car de ce que je lit ça serait plus pour obtenir la nature d'un type. J'ai peut être mal compris..
    Je ne saurais que trop te conseiller de lire un tuto, mais ici tu n'en as pas besoin.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    @youtpout978 : J'ai bien essayé et donc ça ne change rien tjr le même message d’erreur.

    @Bluedeep : Je fait mes tests mais pour le moment ... Mais bon ça me fais pas de mal de chercher un peu.

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    tu es sur de faire un import dll qu'à cet endroit là?
    une autre possibilité est de mettre une variable statique dans ton fichier Program.cs ou tu récupères le répertoire de ton appli avant l'instanciation de ta form
    et après tu peux récupérer ce chemin dans ton dllImport

  16. #16
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    une autre possibilité est de mettre une variable statique dans ton fichier Program.cs ou tu récupères le répertoire de ton appli avant l'instanciation de ta form
    et après tu peux récupérer ce chemin dans ton dllImport
    Non, comme je l'ai mentionné plus haut, c'est impossible : tu ne peux pas utiliser comme argument d'un constructeur de classe Attribute quelque chose qui ne soit pas une constante.
    J'en ai donné les raisons supra.
    Ce n'est pas spécifique à la classe DllImportAttibute.

    Exemples :

    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
    [AttributeUsage(AttributeTargets.Method)]
    class MyAttribute : Attribute
    {
    	public readonly string ContenuAttribut;
    	public MyAttribute(string contenu)
    	{
    		ContenuAttribut = contenu;
    	}
    }
    class Test
    {
    	static readonly string static_string = "ABCEF";
    	const string const_string = "ABCDEF";
     
    	[My(const_string)]
    	void AMethod()
    	{
    	}
    	[My(static_string)]
    	void AMethod2()
    	{
    	}
    }
    Ici, la déclaration de AMethod2 va entrainer une erreur de compilation.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 065
    Points : 4 229
    Points
    4 229
    Par défaut
    d'accord merci pour cette explication (j'avais pas compris que l'attribut dont tu parlais étais celui du dllImport j'avais compris tout autre chose)
    en tout cas je comprend pas pourquoi il est nécessaire que tu indiques le répertoire de ta dll, j'ai fais plusieur appli avec du dllImport et je n'ai jamais eu de problème tant que la dll était dans le même répertoire que l'appli

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Bon rien y fait, j'ai tjr le même problème. Je suis obligé de mettre le lien complet dans dllImport.
    La seule solution est de changer la variable manuellement. Donc cela veut dire que je suis obligé de créer un fichier .exe différent pour chaque ordi ou sera utilisé le programme en fonction de l'endroit ou sera il sera installé. Ça m’ennuie un peu quand même! Mais bon.

    Merci quand même pour votre aide. Et si jamais vous trouvé une solution, je suis tout ouïe!!
    Clément

  19. #19
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par cdumargu Voir le message
    Bon rien y fait, j'ai tjr le même problème. Je suis obligé de mettre le lien complet dans dllImport.

    Tu as essayé de changer l'environnement au début du chargement du programme comme je te l'ai suggéré ?

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur Logiciel Système Embarqués
    Inscrit en
    Février 2010
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur Logiciel Système Embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2010
    Messages : 32
    Points : 25
    Points
    25
    Par défaut
    Oui j'ai essayé, mais quand le programme demande à DllImport l'emplacement de la Dll, il ne la trouve toujours pas. J'y remettrais mon nez demain pour voir si j'ai bien compris tous ce que vous m'avez dit.

    Bon en tt cas je vous remercie tous les deux pour votre aide bien utile. Clément

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 24/11/2006, 11h12
  2. [VB6] Utiliser dll .Net dans VB6
    Par sokette dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 31/03/2005, 14h34
  3. Réponses: 16
    Dernier message: 22/03/2005, 21h57
  4. intégrer dll VB dans code C/C++
    Par inertia dans le forum MFC
    Réponses: 3
    Dernier message: 09/05/2004, 12h09

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