Problème utilisation dll en C# [Résolu]

madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 27 avril 2011 à 16:11 - Dernière réponse : davidsea 4 Messages postés mardi 7 décembre 2004Date d'inscription 13 mars 2014 Dernière intervention
- 13 mars 2014 à 11:05
Bonjour à tous !

Je suis étudiant actuellement en stage, et je doit établir une communication avec une commande numérique grâce à des dll fournies par le constructeur de cette commande numérique (NUM, sous groupe de Schneider).
J'avoue que je n'ai même pas pu faire la base de la base : utiliser une simple méthode d'une des dll fournie :s

Je vois venir d'ici les commentaires du genre "sujet déja traité 10 000 fois !".
Certes ! Mais je doit être un vrai manche, bien que j'ai épluché les 10 000 sujets en question, je bloque toujours à la base de la base. Voila un bout de code qui plante à l'exécution :

class ComNum
    {
        //Class1 TestRef1 = null;
        //Class1Cpp TestRefCpp = null;
        char cTestMsg = 'A';
        int iTestCom = 0;

        public ComNum()
        {
            iTestCom = SetPLCTool("HSL");        // <== ligne de l'exception
        }

        [DllImport("lib_unit2.dll")]
        static extern Int16 SetPLCTool(string stTypeCom);

        public char TestMsg
        {
            get
            {
                return cTestMsg;
            }
        }

        public int TestCom
        {
            get
            {
                return iTestCom;
            }
        }
    }


Voila, je veux donc utiliser depuis une autre classe la fonction short SetPLCTool(char* conf) de la dll lib_unit2.dll, que j'ai placé dans un premier temps dans le répertoire du projet, puis dans tous les sous répertoire (aucune info sur google du répertoire dans lequel va chercher le [DllImport] !!!) pour tester. Au passage, j'ai mis avec le .lib et le .h qui allaient avec, à tout hasard...

Il me sort systématiquement une exception assez bateau :

"Impossible de charger la DLL 'lib_unit2.dll': Le module spécifié est introuvable. (Exception de HRESULT : 0x8007007E)"

Pour info : la dll a été crée en visual basic, selon le constructeur. Je code avec visual studio 2010 (projet c# windowsForm).

Etant donné que j'ai rien trouvé sur google par rapport à mon problème, je suppose que c'est que le solution est tellement bête que ça méritait même pas d'en parler ^^

Merci de votre aide !
mad keyboard.
Afficher la suite 

14 réponses

Répondre au sujet
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 28 avril 2011 à 00:54
+3
Utile
Salut, si on part du principe que la signature P/Invoke de ta fonction est correcte alors soit la DLL n'est pas dans le même dossier que l'application au moment de l'exécution soit la DLL native à elle même besoin d'une autre DLL qui ne se trouve pas dans le dossier.

Utilise "Dependency Walker" pour connaitre les dépendances de ta librairie.

http://www.dependencywalker.com/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Lutinore
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 28 avril 2011 à 17:51
+3
Utile
IESHIMS.DLL est manquant, c'est classique et ça ne pose pas de problème..

Je ne connais pas cette DLL "X_UTW2.DLL" elle doit être ton le dossier de ton EXE ou au moins dans le dossier System. Il te manque quelque chose sur ton PC.. Un framework, une API, un runtime, un correctif etc..

Autre possibilité il ne trouve pas la fonction "SetPLCTool" dans la lib, et donc ne charge pas la lib mais en général le message d'erreur est plus explicite que ça..

Ces 2 problèmes arrivent souvent lorsque la lib C++ n'a pas été compilée pour tourner sur la version Windows actuelle.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Lutinore
cs_DrAsh 4 Messages postés samedi 23 octobre 2010Date d'inscription 27 avril 2011 Dernière intervention - 27 avril 2011 à 17:46
0
Utile
Salu;

essaye ceci:
Dans l'explorateur de solution, clique droit sur le dossier References de ton projet, puis choisis ajouter une référence;

dans les tabulation choisis parcourir, ensuite selectione la dll lib_unit2.dll;

puis OK;


maintenant ton code seras :

class ComNum
    {
        //Class1 TestRef1 = null;
        //Class1Cpp TestRefCpp = null;
        char cTestMsg = 'A';
        int iTestCom = 0;

        public ComNum()
        {
            iTestCom = lib_unit2.SetPLCTool("HSL");        
        }

        

        public char TestMsg
        {
            get
            {
                return cTestMsg;
            }
        }

        public int TestCom
        {
            get
            {
                return iTestCom;
            }
        }
    }


Commenter la réponse de cs_DrAsh
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 27 avril 2011 à 18:09
0
Utile
Arf, c'est sur ce serait au top !
J'y avais quand même pensé ^^
Il me dit :

"Une référence à 'D:\...\lib_unit2.dll' n'a pas pu être ajouttée. Vérifiez que ce fichier est accessible et qu'il s'agit d'un assembly ou d'un composant COM valide"

En l'occurence, je doute qu'il s'agisse d'une assembly ou d'un composant COM, étant donné que ce n'est pas du code managé !! (pour ce que j'ai pu en lire sur les différents forum, mais après, vu ce que je m'y connais...)

Une autre idée ?
Commenter la réponse de madkeyboard
cs_DrAsh 4 Messages postés samedi 23 octobre 2010Date d'inscription 27 avril 2011 Dernière intervention - 27 avril 2011 à 18:41
0
Utile
ah ! la dll n'est pas .Net

Donc la seule solution est d'utiliser dllimport;
dans quel dossier as tu placé la dll ?
Commenter la réponse de cs_DrAsh
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 28 avril 2011 à 09:33
0
Utile
Donc la seule solution est d'utiliser dllimport;
dans quel dossier as tu placé la dll ?


>

Voila, je veux donc utiliser depuis une autre classe la fonction short SetPLCTool(char* conf) de la dll lib_unit2.dll, que j'ai placé dans un premier temps dans le répertoire du projet, puis dans tous les sous répertoire (aucune info sur google du répertoire dans lequel va chercher le [DllImport] !!!) pour tester.


A priori c'est pas la le souci !

Utilise "Dependency Walker" pour connaitre les dépendances de ta librairie.


Cool merci, la ça donne quelque chose !

Il ne trouve pas certain fichiers :
X_UTW2.DLL
IESHIMS.DLL
WER.DLL
Qui sont tous des dépendances de "user32.dll". C'est pas normal non ?

Et il m'en met 1 en rouge :
MPR.DLL (encore un dépendance de "user32.dll")

Sinon, il met des sabliers devant la quasi totalité du reste. (excepté, entre autre, ma libray et ses 2 dépendances directes : kernel32.dll et user32.dll)

Voila, si t'a une idée, je suis tout ouïe ^^ Faut peut-être réinstaller une library ? ou le framwork ?
Commenter la réponse de madkeyboard
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 28 avril 2011 à 09:59
0
Utile
J'ajoutte juste un détail :
J'ai essayé d'ouvrir l'exe de dependency walker dans lui-même, il ne trouve pas non plus 2 fichiers :
IESHIMS.DLL
WER.DLL
Par contre il n'émet pas de message d'erreur.

J'avais oublié de mentionner que quand j'ouvre ma dll, il ouvre une boite de dialogue avec l'erreur :
"Errors were detected when processing 'D:\...\LIB_UNIT2.DLL'. See the log windows for details"
=>
"Error: At least one required implicit or forwarded dependency was not found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."

Voila tout ^^
Commenter la réponse de madkeyboard
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 29 avril 2011 à 09:12
0
Utile
C'est bien possible !
La library est très vieille à priori, par contre j'ai essayé avec celle d'un collègue qui exploite depuis c++ les library dont j'ai besoin (à priori, lui ça fonctionnait quand il à tout créé !), j'ai les mêmes soucis ! Et lui aussi sur son propre PC, maintenant... Il doit y avoir eu une modif sur une mise à jour de windaube, ou une bêtise dans le genre...

Sinon j'ai essayé avec d'autres fonctions, dont j'ai bien vérifié le prototype dans le .lib, ça donne toujours rien :s

Je pense que le X_UTW2.DLL est dans le système, vu qu'elle est une dépendance de user32 ! J'ai essayé d'une autre manière sur visual :

[DllImport("kernel32")]
static extern int LoadLibrary(string librayName);
...
iTest = LoadLibrary("D:\\...\\InterpretTempIntensity.dll"); //library de mon collègue

La première fois que j'exécute, il m'a affiché une textBox qui me dit qu'il manque la library X_UTW2.DLL ! A priori ça confirme l'origine du problème... Les exécutions suivantes il n'a plus rien dit par contre :s
Commenter la réponse de madkeyboard
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 29 avril 2011 à 09:18
0
Utile
La première fois que j'exécute, il m'a affiché une textBox qui me dit ...

Pas une textBox, une message box plutôt ! Enfin la petite fenêtre windows qui donne les erreurs ^^
Et petit détail qui à peut-être son importance : la fenêtre à un design windows 2000 ! Je sais pas du tout d'où elle sort !
Commenter la réponse de madkeyboard
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 29 avril 2011 à 10:02
0
Utile
Pour te donner un aperçu :
(j'appel la fonction contenant le code affiché en appuyant sur le boutton Test)
Commenter la réponse de madkeyboard
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 29 avril 2011 à 14:04
0
Utile
Problème résolu !!!

Il existe un kit d'outil pour les commandes numériques NUM : NUMTools. J'ai cherché sur un ordi avec ces outils, j'ai trouvé dans le system32 la dll X_UTW2 (UTW comme unitel way), je me suis donc douté que c'était le NUMTool qui l'installait !

J'ai donc installé le kit NUMTools, j'ai bien retrouvé la dll dans system32 et j'ai enfin pu vérifier l'appel de ma dll !!! Il génère encore quelques erreures, mais je devrais m'en sortir.

En tout cas, merci pour ton dependancy walker, c'est lui qui m'a mis sur la piste ^^
a+

Mad Keyboard
Commenter la réponse de madkeyboard
raniach 3 Messages postés vendredi 20 mai 2011Date d'inscription 30 mai 2011 Dernière intervention - 30 mai 2011 à 16:15
0
Utile
Bonjour a tous,
je suis une étudiante, je suis en stage de PFE et je essai de développer une application en C#.le problème ce que je veux créé un code pour authentification a partir de base de donnée , c.a.d quand en clic sur la boutant connexion il lit le données a partir de textbox et il les vérifier dans le base?
s'il vous plait pouvez vous m'aider ?
merci
Commenter la réponse de raniach
madkeyboard 100 Messages postés mercredi 27 avril 2011Date d'inscription 21 décembre 2012 Dernière intervention - 9 juin 2011 à 09:17
0
Utile
Salut !

Quand on post un nouveau message sur un forum, faut démarrer un nouveau topic, et dans le bon sujet !!!
Moi perso je m'y connais pas grand chose en BDD, mais retourne sur le forum, va dans le thème bases de données et ré-expose ton problème. Ici personne ne va retourner voir les messages, ce sujet est fermé et résolu !!!

Bonne chance ^^

Mad Keyboard
Commenter la réponse de madkeyboard
davidsea 4 Messages postés mardi 7 décembre 2004Date d'inscription 13 mars 2014 Dernière intervention - 13 mars 2014 à 11:05
0
Utile
Bonjour bonjour,
Déterrage de post...
J'ai exactement le même développement à faire.
Avez-vous pu mener à bien votre projet ?
Merci

--
Commenter la réponse de davidsea

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.