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++/CLI Discussion :

Appeler du code C# � partir de code C


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par d�faut Appeler du code C# � partir de code C
    Bonjour � tous,

    j'ai besoin d'encapsuler un code C# dans un code C, pour permettre l'interop�rabilit� avec d'autres langages qui ne supportent pas .NET, et je gal�re un peu.

    J'ai pens� qu'encapsuler ma dll C# avec du C++/CLI, puis passer du C++/CLI au C serait la bonne m�thode. J'ai essay� de faire tout �a dans la m�me dll, ce qui n'est peut-�tre pas une bonne id�e.
    J'ai mis ma dll C++/CLI en mode /clr, qui permet l'interop�rabilit�. Pourtant, quand je compile mon code en dll, aucun fichier .lib n'est g�n�r�, alors qu'habituellement il y en a un. Quand je compile en statique, j'ai un
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Warning LNK4221 : no public symbols found; archive member will be inaccessible
    Et effectivement, quand j'essaie d'appeler ma dll depuis un code C++ natif, j'ai une erreur au lien avec le fichier .lib.
    Sous VISUAL 2008 :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Error	1	error LNK2019: unresolved external symbol __imp__getSupportedLanguages referenced in function _wmain	win32_testdll.obj	win32_testdll
    J'ai la m�me erreur avec MinGW :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    undefined reference to "__imp__getSupportedLanguages"
    Au moins mes compilos sont d'accord, ce doit �tre ma librairie en C++/CLI qui n'exporte pas les bons symboles. Je suppose que c'est une histoire de manag�/pas manag�, mais je ne sait pas trop comment m'y prendre.

    La question finalement c'est de savoir comment faire pour obtenir une dll avec une interface externe non manag�e et une interface interne manag�e! Dans la FAQ c'est surtout le contraire qui est bien montr�. Quelqu'un aurait une id�e pour faire �a?

    Je rajoute mon fichier .h si �a peut aider :
    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
    24
    25
    26
    27
    28
    // dll_c.h
    #ifndef DLL_C_H
    #define DLL_C_H
    #pragma once
     
    #ifdef DLL_EXPORT
    #define DllImportExport  __declspec( dllexport )
    #else
    #define DllImportExport  __declspec( dllimport )
    #endif
    //#include <stdlib.h>
     
    //using namespace System;
     
    namespace dll_c {
     
    	#ifdef __cplusplus
        extern "C" {
        #endif
     
    	DllImportExport int getSupportedLanguages(char **langages, int *arraySize, char *errormsg);
     
        #ifdef __cplusplus
        }
        #endif
    }
     
    #endif //DLL_C_H

  2. #2
    Expert confirm�

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Architecte technique
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par d�faut
    Salut,

    en fait, il faut que tu definisse ta classe comme etant comvisible, et que tu exposes les methodes/enumerations dont tu as besoin...

    Jamais fait, par contre


    ------------------

    Edit : par contre, j'ai trouve ca :

    http://www.codeproject.com/KB/vb/COM_Interop.aspx

    Ca m'a l'air de bien correspondre a ce que tu veux...

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer � la rubrique .NET ? Contactez-moi par MP.
    Vous voulez r�diger des articles pour la rubrique .NET ? Voici la proc�dure � suivre.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par d�faut
    Apparemment oui, je checke un coup pour voir

  4. #4
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    l'assembly c++/cli n'a pas � exporter des m�thodes comme une dll classique

    tu peux regarder cet exemple dans mon tutoriel
    http://nico-pyright.developpez.com/t...LwrapperCppCli
    ou dans ce post http://blog.developpez.com/nico-pyri...i_exe#more6460

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par d�faut
    Merci � tous les deux pour vos r�ponses!

    @ nico-pyright(c)

    l'assembly c++/cli n'a pas � exporter des m�thodes comme une dll classique
    Ben en fait si, parce que dans mon cas, le code appelant est un code non manag� en C, C++ ou autre. C'est la dll de base qui est en .NET et que je veux encapsuler. En fait je veux faire le contraire de ce que tu fais dans ton tuto.

    Le code de l'encapsulation est le suivant :

    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
    24
    25
    26
    27
    28
    29
    // This is the main DLL file.
     
    //#include "stdafx.h"
     
    #include "dll_c.h"
     
    using namespace TousLesNamespacesQuiVontBien;
     
     
    int getSupportedLanguages(char **languages, int *arraySize, char *errormsg)
    {
    	MyController controler;
    	String ^errormessage = gcnew String("");
    	List<String^> ^langues = gcnew List<String^>();
     
    	bool ret = controler.GetSupportedLanguages(langues, errormessage);
     
    	langues->Add("ENGLISH");
    	langues->Add("SPANISH");
     
    	*arraySize = langues->Count;
     
    	for (int i=0; i<*arraySize; ++i){
    		languages[i] = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(langues[i]).ToPointer());
    	}
     
    	errormsg = static_cast<char *>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(errormessage).ToPointer());
    	return (ret? 0 : 1);
    }
    Mon probl�me, c'est que je n'arrive pas � appeler cette dll depuis un code C++ natif. J'ai une erreur au link, comme dit dans mon premier post.

    Ce qui me para�t bizarre c'est que quand je compile ma dll C++/CLI, aucun fichier .lib n'est g�n�r�, alors que quand on compile un dll en C++ natif, il y a un .lib, dont on se sert ensuite pour linker la dll.
    Y'a-t-il un moyen de g�n�rer une dll C++/CLI qui puisse �tre appel�e par un code natif?

    @pvialatte

    J'ai lu le lien que tu m'a envoy�, �a � l'air compliqu� mais pour l'instant je n'ai pas de meilleure solution que de passer par ces objets COM.

  6. #6
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    ok,
    donc tu veux utiliser une dll c# dans un projet C++ natif

    pas besoin de dll interm�diaire, tu peux faire du com interop comme d�j� sugg�r� ou du hosting de clr, voir dans ce tuto http://nico-pyright.developpez.com/t...2005/interop2/

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par d�faut
    Merci pour ta r�ponse et ton tuto, que (j'avoue) j'avais diagonalis� sans m'arr�ter sur la partie qui parlait de mon probl�me. En fait le wrapper invers� r�soud mon probl�me. J'ai repris ton code et int�gr� le mien � la place, �a marche!

    Par contre avec mon ancien projet, le fichier lib n'est toujours pas g�n�r�. As-tu activ� une option sp�ciale pour �a?

  8. #8
    R�dacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par d�faut
    tu veux dire que tu as un projet qui construit une dll native mais aucun .lib n'est g�n�r� ?

    dans ce cas, c'est que tu n'as pas d�clar� des m�thodes qui doivent �tre export�es
    soit explicitement dans le code, soit avec un .def �ventuellement

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    15
    D�tails du profil
    Informations personnelles :
    �ge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 15
    Par d�faut Merci!

    Ca y est, j'ai trouv� ce qui merde dans mon code: en fait �a ne cr�e pas de .lib quand j'ai d�clar� ma fonction dans un namespace (�a je comprends pas vraiment pourquoi). J'ai vir� le namespace et �a marche. Youpi!!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 0
    Dernier message: 18/11/2011, 15h18
  2. Appel de script vbs � partir du code c#
    Par mo5andes dans le forum C#
    R�ponses: 2
    Dernier message: 30/09/2009, 12h03
  3. R�ponses: 5
    Dernier message: 14/12/2007, 15h51
  4. R�ponses: 13
    Dernier message: 01/10/2006, 15h52

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