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 :

DllImport fonctionne en .NET 3.5 mais pas en 4 !


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut DllImport fonctionne en .NET 3.5 mais pas en 4 !
    Bonjour,

    J'ai rencontré un problème sur quelque chose que je sais pas faire en framework 3.5 d'habitude : exporter mes fonctions c++ via DllImport. Cette fois ci j'ai fait un projet en framework 4 et j'ai eu le droit à une exception du type : la signature de la fonction n'est pas la même en code managé et en code non managé. J'ai mis du temps à cherche l'erreur en vain, puis que j'ai passé mon projet en 3.5 et là magie ça marche !

    Voici un exemple:
    C++/Qt : Quand j'appelle une fonction sans paramètre ça marche bien, si là je rajoute un paramètre même en int ça foire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    extern "C" VISUVIDEOENGINE_EXPORT VisuVideoEngine *VisuVideoEngine_TEST(int c)
    {
    	VisuVideoEngine *instance = new VisuVideoEngine(QString(""), QString(""));
    	return instance;
    }
    C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("VisuVideoEngine.dll")]
    public static extern IntPtr VisuVideoEngine_TEST( int a);
    Est-ce que quelqu'un saurait pourquoi ça ne fonctionne plus en 4 ?

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Bizarre! La seule différence dont j'ai entendu parler entre /NET 3.5 et 4.0 à propos des DllImport est la CallingConvention. .NET 3.5 était plus permissif et corrigeait automatiquement les erreurs, mais pour des questions de performances ils ont modifié ça dans .NET 4.0

    On ne sait jamais, essaye avec
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [DllImport("VisuVideoEngine.dll",CallingConvention=CallingConvention.Cdecl)]

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    Bon ben apparement ça marche nickel avec la CallingConvention !
    Merci

  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 : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    A noter que exporter des fonctions C/C++ en C Calling Convention (CDecl) n'est pas standard. En effet, si .Net accepte de consommer de telles fonctions, peu d'outils en font autant.

    Le standard est d'exporter en __stdcall (coté C, soit StdCall coté .NET) qui est la convention dite aussi "Pascal" (qui est aussi celle utilisé par les APIs Windows).

    Cette convention est à peu près universellement supportée.

    Une exception : en Windows CE & Windows Mobile le standard est la convention d'appel C.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 33
    Par défaut
    Du côté c++ j'utilise Qt, donc l'export est fait une macro Qt, je sais pas trop ce qu'il y a derrière, peut être qu'il n'y a pas le __stdcall.

    Merci pour vos réponse !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonctionne très bien sous IE mais pas sous FF
    Par deborah95 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/07/2008, 19h15
  2. je trouve asp.net web service mais pas asp.net web application
    Par question87 dans le forum Visual Studio
    Réponses: 1
    Dernier message: 22/04/2008, 22h26
  3. Réponses: 4
    Dernier message: 22/01/2008, 14h03
  4. Lien fonctionnant sous opera et ff mais pas sous IE
    Par Halukard dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/09/2007, 21h46
  5. net send marche, mais pas ping...
    Par rvfranck dans le forum Administration
    Réponses: 7
    Dernier message: 04/02/2006, 23h09

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