Newsgroup: it.comp.programmare.win32
Titolo: Uso librerie C++ in C# da it.comp.lang.c++

------------------------------------da it.comp.lang.c++ ---I° post
originale---------------------------
Salve a tutti,
avrei la necessità di integrare una mia libreria scritta in c++ in un codice
scritto in c#.
Dato che la libreria è in continuo sviluppo in c++, vorrei evitare di fare
continue conversioni e quindi cercare di utilizzare in c# direttamente la
libreria programmata in c++.
E' possibile? Esistono più soluzioni al problema?
Ringrazio anticipatamente per qualunque chiarimento a riguardo.
Saluti
Federico.
------------------------------------da it.comp.lang.c++ ---II°post
originale---------------------------
Ho un problema molto simile al tuo, aggravato dal fatto che il codice
C++ è parzialmente portabile sotto Linux. La via che ho trovato è di
mettere il codice C++ in una dll, e poi scrivere una dll wrapper in
Cpp managed.
Comunque siamo OT, ti prego di spostare queste discussione (che a me
interessa assai) su it.comp.programmare.win32
---------------------------------------
it.comp.programmare.win32---------------------------------
Fino a scrivere una Dll in c++ (Visual Studio 6) ci arrivo, ma mi sa che mi
manca il concetto di wrapper Cpp managed. Cioè si deve realizzare un managed
code, ma come si fa? Ci sono riferimenti semplici e chiari a riguardo?
Su alcuni esempi sull'uso delle OpenGl (NeHe) in c# viene direttamente
importata la Dll che viene utilizzata in c++, ma mi sembra una procedura un
po' farraginosa anche se ha il vantaggio che la Dll la scrivo per il c++ e
la uso senza modifiche anche in C#, ma non ho idea di quanto questo
approccio possa portare lontano nel senso: come uso delle classi scritte in
c++? In questa ottica forse è meglio qualche altra metodologia.
Ciao,
Federico.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

manca il concetto di wrapper Cpp managed.
Prima di intavolare il discorso ti vorrei chiedere una cosa: sarebbe
un problema (economico) passare alla versione più recente di Visual
Studio?
Una classe wrapper c++ managed su una classe c++ potrebbe avere una
forma simile:
codice managed ->
    public __gc class ClientVigile
   {
   public:
      ClientVigile();
      ClientVigile(Ini __gc* qini);
      void Initialize(blabla);
      void Send(blabla);
   private:
      _PRIVATO_::ClsClientVigile __nogc* m_cd;
   };
codice in c++ puro di un'altra dll da "inscatolare" ->
namespace _PRIVATO_
{
   class __declspec( dllimport ) ClsClientVigile
   {
   public:
      ClsClientVigile();
      ~ClsClientVigile();
      void Initialize(blabla);
      void Send(blabla);
   private:
      void* m_cd;
   };
}
e come puoi vedere uso almeno tre keyword riservate. Due sono per
l'importazione di una classe definita nella dll esterna:
__declspec( dllimport )
e l'ultima ha a che fare con il c++ managed:
__gc
Personalmente non ci penso nemmeno a cercare un compilatore a riga di
comando che supporti queste cose. Già programma (e faccio debug) a
riga di comando sotto linux, e mi basta.
-- 
sito Papero 2 (database):       
http://user.7host.com/papero/
sito Papero 3 (passatempi):     
http://digilander.iol.it/davidequack


Hops! Mi sa che stai un po' avanti rispetto a me: io non sono un
programmatore, anche se sfrutto il c++ per scrivere le mie librerie di
calcolo. In effetti del c# mi interessava più che altro la facilità di
gestione delle interfacce, ma non ne so ancora molto. Per il passaggio a
.NET non c'è nessun problema, anzi, probabilmente lo faro'.
Grazie per l'aiuto,
mi documenterò un po'
Ciao,
Federico


gestione delle interfacce
Allora scrivi la classica DLL in C++, in cui per l'interfaccia vai
pesantemente di extern "C". E' garantita la compatibilità con quel
"genere" di risorse, anche se io ho avuto dei problemi.
Oppure l'immarcescibile "server" in C++, con interfaccia in
qualcos'altro con comunicazione via socket. Io mi ci guadagno da
vivere da moltissimi anni con questa "soluzione". Ci sono una miriade
di vantaggi in una soluzione simile.



Buona la prima.
Grazie,
Federico.
PS: cmq i la libreria la sto scrivendo per questo genere di applicazioni
http://xoomer.virgilio.it/temporeale/
Ultimamente non ho avuto il tempo per aggiornare il sito con le ultime
versioni.
Occorre una scheda grafica con 128mb perchè il motore grafico è molto
spartano.



http://xoomer.virgilio.it/temporeale/
Non mi va il sito.



Non saprei, a me va!
prova con
http://xoomer.virgilio.it/temporeale/default.htm
Ciao,
Federico.



http://xoomer.virgilio.it/temporeale/default.htm
Niente da fare, la pagina si ricarica in continuazione e non si vede
una ceppa. Cazzoni quelli di virgilio mi sa.



Ho provato con extern blablabla e il tutto funziona, ma per utilizzare le
classi della lib mi sa che è un po' più complesso. Alla fine penso di
riorientarmi verso le MFC che superato il primo impatto permettono di creare
interfacce in modo abbastanza agevole.
Grazie comunque.
Federico.


classi della lib mi sa che è un po' più complesso.
Infatti non puoi, e con MFC non risolverai nulla. E' una questione di
mailing dei nomi (o come diavolo si dice).
Però puoi gestire le classi DENTRO la dll e arrivare ad essi tramite
degli handle. Tutto (quasi tutto) il S.O. windows è fatto così, puoi
farlo anche tu.
Poi in C# fa un oggetto "wrapperino" che contiene un handle, e i
metodi della classe sono del tipo
class MiaClasse
{
pubblic:
	MiaClasse()
	{
		handle = DLL_GeneraIstanzaMiaClasse();
	}
	~MiaClasse()
	{
		DLL_DistruggiGenercaIstanza(handle);
	}
	int MetodoX(parametri blbla)
	{
		return DLL_IstanzaMiaClasseMetodoX(handle, parametri blbla)
	}
private:
	int handle;
};
C'è di bello che domani una DLL del genere la porti sotto il
linguaggio K (qualunque esso sia) in batter d'occhio.


 linguaggio K (qualunque esso sia) in batter d'occhio.
grazie mille, sembra una soluzione fattibile,...proverò, anche se sto c# mi
ha già stressato
Saluti,
Federico
