OVH Cloud OVH Cloud

chargement dynamique d'une DLL écrite en c++

5 réponses
Avatar
Nicolas B
Salut

est-il possible de charger une dll dynamiquement en c# sachant que la dll a
été écrite en c++ (non managé et sans passer par des objets COM)

Si oui, quel sont les avantages et les inconvénients par rapport à une
méthode consistant à créer un wrapper en C++ managé.


merci

@+, Nico

5 réponses

Avatar
Vko
Je sais pas si c'est vraiment ca que tu veux :
Mais oui il est possible de charger des méthode depuis des
DLL non-managé et non-COM.

Exemple :

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",
SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConventionÊllingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

Pour les avantages et inconvénients ... je ne serais pas
répondre mais je te préconiserai un wrapper de classe pour
une meilleur homogénéité et maintenance de ton code. Par
code niveau performance ca fait une couche en plus.

-----Message d'origine-----
Salut

est-il possible de charger une dll dynamiquement en c#


sachant que la dll a
été écrite en c++ (non managé et sans passer par des


objets COM)

Si oui, quel sont les avantages et les inconvénients par


rapport à une
méthode consistant à créer un wrapper en C++ managé.


merci

@+, Nico


.



Avatar
Nicolas B
Merci

mais mon problème est que mon application C# ne connait pas (à l'avance) les
DLL qu'elle va devoir charger et donc les objets ou les fonctions à
l'intérieur des dll.

merci quand même

@+, Nico
"Vko" a écrit dans le message de
news:2b4a01c49b35$7afed6f0$
Je sais pas si c'est vraiment ca que tu veux :
Mais oui il est possible de charger des méthode depuis des
DLL non-managé et non-COM.

Exemple :

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",
SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConventionÊllingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

Pour les avantages et inconvénients ... je ne serais pas
répondre mais je te préconiserai un wrapper de classe pour
une meilleur homogénéité et maintenance de ton code. Par
code niveau performance ca fait une couche en plus.

-----Message d'origine-----
Salut

est-il possible de charger une dll dynamiquement en c#


sachant que la dll a
été écrite en c++ (non managé et sans passer par des


objets COM)

Si oui, quel sont les avantages et les inconvénients par


rapport à une
méthode consistant à créer un wrapper en C++ managé.


merci

@+, Nico


.



Avatar
Paul Bacelar
Les fonctions nécessaires sont LoadLibrary et GetProcAddress mais vu le
prototypage de ces fonctions, le marshaling (passage du managé au non managé
et vice-versa) ne va pas se faire sans douleur.

Pour ce qui est des objets, si il n'y pas d'export via COM, je te conseil
d'abandonner tout espoir, voir le mangling (décoration) C++ des méthodes est
une épreuve difficilement supportable pour le commun des mortels.

Utilisez un wrapper en C++ managé va te permettre de faire le marshaling de
manière bien plus confortable car tu peut mélanger du code qui utilise des
objets managé et des objets managés.
--
Paul Bacelar
Demandeur d'emploi


"Nicolas B" wrote in message
news:
Merci

mais mon problème est que mon application C# ne connait pas (à l'avance)


les
DLL qu'elle va devoir charger et donc les objets ou les fonctions à
l'intérieur des dll.

merci quand même

@+, Nico
"Vko" a écrit dans le message de
news:2b4a01c49b35$7afed6f0$
Je sais pas si c'est vraiment ca que tu veux :
Mais oui il est possible de charger des méthode depuis des
DLL non-managé et non-COM.

Exemple :

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",
SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConventionÊllingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

Pour les avantages et inconvénients ... je ne serais pas
répondre mais je te préconiserai un wrapper de classe pour
une meilleur homogénéité et maintenance de ton code. Par
code niveau performance ca fait une couche en plus.

>-----Message d'origine-----
>Salut
>
>est-il possible de charger une dll dynamiquement en c#
sachant que la dll a
>été écrite en c++ (non managé et sans passer par des
objets COM)
>
>Si oui, quel sont les avantages et les inconvénients par
rapport à une
>méthode consistant à créer un wrapper en C++ managé.
>
>
>merci
>
>@+, Nico
>
>
>.
>




Avatar
Nicolas B
Ok où est-ce que je pourrais trouver de la (bonne) doc sur le marshaling et
le mangling.
pour moi il s'agit de terme barbare :-) que j'aimerai approfondir mais si je
pense qu'au final je vais m'orienté vers un wrapper

merci @+

"Paul Bacelar" a écrit dans le message
de news:Oy$
Les fonctions nécessaires sont LoadLibrary et GetProcAddress mais vu le
prototypage de ces fonctions, le marshaling (passage du managé au non


managé
et vice-versa) ne va pas se faire sans douleur.

Pour ce qui est des objets, si il n'y pas d'export via COM, je te conseil
d'abandonner tout espoir, voir le mangling (décoration) C++ des méthodes


est
une épreuve difficilement supportable pour le commun des mortels.

Utilisez un wrapper en C++ managé va te permettre de faire le marshaling


de
manière bien plus confortable car tu peut mélanger du code qui utilise des
objets managé et des objets managés.
--
Paul Bacelar
Demandeur d'emploi


"Nicolas B" wrote in message
news:
> Merci
>
> mais mon problème est que mon application C# ne connait pas (à l'avance)
les
> DLL qu'elle va devoir charger et donc les objets ou les fonctions à
> l'intérieur des dll.
>
> merci quand même
>
> @+, Nico
> "Vko" a écrit dans le message de
> news:2b4a01c49b35$7afed6f0$
> Je sais pas si c'est vraiment ca que tu veux :
> Mais oui il est possible de charger des méthode depuis des
> DLL non-managé et non-COM.
>
> Exemple :
>
> [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",
> SetLastError=true,
> CharSet=CharSet.Unicode, ExactSpelling=true,
> CallingConventionÊllingConvention.StdCall)]
> public static extern bool MoveFile(String src, String dst);
>
> Pour les avantages et inconvénients ... je ne serais pas
> répondre mais je te préconiserai un wrapper de classe pour
> une meilleur homogénéité et maintenance de ton code. Par
> code niveau performance ca fait une couche en plus.
>
> >-----Message d'origine-----
> >Salut
> >
> >est-il possible de charger une dll dynamiquement en c#
> sachant que la dll a
> >été écrite en c++ (non managé et sans passer par des
> objets COM)
> >
> >Si oui, quel sont les avantages et les inconvénients par
> rapport à une
> >méthode consistant à créer un wrapper en C++ managé.
> >
> >
> >merci
> >
> >@+, Nico
> >
> >
> >.
> >
>
>




Avatar
Paul Bacelar
Je pense que c'est une bonne décision dans l'absolu.

Pour la documentation, MSDN est plein d'exemples de marshaling et pour le
mangling C++, le C++ managé te permet de tant abstraire.
--
Paul Bacelar
Demandeur d'emploi


"Nicolas B" wrote in message
news:
Ok où est-ce que je pourrais trouver de la (bonne) doc sur le marshaling


et
le mangling.
pour moi il s'agit de terme barbare :-) que j'aimerai approfondir mais si


je
pense qu'au final je vais m'orienté vers un wrapper

merci @+

"Paul Bacelar" a écrit dans le message
de news:Oy$
> Les fonctions nécessaires sont LoadLibrary et GetProcAddress mais vu le
> prototypage de ces fonctions, le marshaling (passage du managé au non
managé
> et vice-versa) ne va pas se faire sans douleur.
>
> Pour ce qui est des objets, si il n'y pas d'export via COM, je te


conseil
> d'abandonner tout espoir, voir le mangling (décoration) C++ des méthodes
est
> une épreuve difficilement supportable pour le commun des mortels.
>
> Utilisez un wrapper en C++ managé va te permettre de faire le marshaling
de
> manière bien plus confortable car tu peut mélanger du code qui utilise


des
> objets managé et des objets managés.
> --
> Paul Bacelar
> Demandeur d'emploi
>
>
> "Nicolas B" wrote in message
> news:
> > Merci
> >
> > mais mon problème est que mon application C# ne connait pas (à


l'avance)
> les
> > DLL qu'elle va devoir charger et donc les objets ou les fonctions à
> > l'intérieur des dll.
> >
> > merci quand même
> >
> > @+, Nico
> > "Vko" a écrit dans le message de
> > news:2b4a01c49b35$7afed6f0$
> > Je sais pas si c'est vraiment ca que tu veux :
> > Mais oui il est possible de charger des méthode depuis des
> > DLL non-managé et non-COM.
> >
> > Exemple :
> >
> > [DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",
> > SetLastError=true,
> > CharSet=CharSet.Unicode, ExactSpelling=true,
> > CallingConventionÊllingConvention.StdCall)]
> > public static extern bool MoveFile(String src, String dst);
> >
> > Pour les avantages et inconvénients ... je ne serais pas
> > répondre mais je te préconiserai un wrapper de classe pour
> > une meilleur homogénéité et maintenance de ton code. Par
> > code niveau performance ca fait une couche en plus.
> >
> > >-----Message d'origine-----
> > >Salut
> > >
> > >est-il possible de charger une dll dynamiquement en c#
> > sachant que la dll a
> > >été écrite en c++ (non managé et sans passer par des
> > objets COM)
> > >
> > >Si oui, quel sont les avantages et les inconvénients par
> > rapport à une
> > >méthode consistant à créer un wrapper en C++ managé.
> > >
> > >
> > >merci
> > >
> > >@+, Nico
> > >
> > >
> > >.
> > >
> >
> >
>
>