Problème utilisation dll en C#

Résolu
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 - 27 avril 2011 à 16:11
davidsea Messages postés 4 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 13 mars 2014 - 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.
A voir également:

14 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 avril 2011 à 00:54
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/
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 avril 2011 à 17:51
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.
3
cs_DrAsh Messages postés 4 Date d'inscription samedi 23 octobre 2010 Statut Membre Dernière intervention 27 avril 2011
27 avril 2011 à 17:46
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;
            }
        }
    }


0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
27 avril 2011 à 18:09
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DrAsh Messages postés 4 Date d'inscription samedi 23 octobre 2010 Statut Membre Dernière intervention 27 avril 2011
27 avril 2011 à 18:41
ah ! la dll n'est pas .Net

Donc la seule solution est d'utiliser dllimport;
dans quel dossier as tu placé la dll ?
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
28 avril 2011 à 09:33
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 ?
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
28 avril 2011 à 09:59
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 ^^
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
29 avril 2011 à 09:12
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
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
29 avril 2011 à 09:18
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 !
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
29 avril 2011 à 10:02
Pour te donner un aperçu :
(j'appel la fonction contenant le code affiché en appuyant sur le boutton Test)
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
29 avril 2011 à 14:04
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
0
madkeyboard Messages postés 100 Date d'inscription mercredi 27 avril 2011 Statut Membre Dernière intervention 21 décembre 2012 1
9 juin 2011 à 09:17
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
0
davidsea Messages postés 4 Date d'inscription mardi 7 décembre 2004 Statut Membre Dernière intervention 13 mars 2014
13 mars 2014 à 11:05
Bonjour bonjour,
Déterrage de post...
J'ai exactement le même développement à faire.
Avez-vous pu mener à bien votre projet ?
Merci

--
0
raniach Messages postés 3 Date d'inscription vendredi 20 mai 2011 Statut Membre Dernière intervention 30 mai 2011
30 mai 2011 à 16:15
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
-1
Rejoignez-nous