Newsgroup: it.comp.dotnet
Titolo: Integrare codice C in progetto c#

Salve,
premetto che non sono un utente esperto di visual studio.
Ho un porgetto c# al quale vorrei aggiungere delle porzioni di codice
scritte in linguaggio C.
Come posso fare? Esiste un progetto (o una soluzione) di esempio dove
ci siano parti scritte in c# e parti scritte in C ?
Dalle prime prove che ho fatto mi sembra di capire (spero di
sbagliarmi) che non si possa usare piu di un linguaggio per il singolo
progetto, quindi sembra indispensabile fare una soluzione con 2
progetti di cui uno scritto in c# e l'altro in C++
grazie
Federico


Ci sono almeno tre soluzioni:
1. I Platform Invocation Services (chiamati PInvoke) che ti permettono 
di caricare in memoria dll native e chiamare le API in formato "C"
Pro: veloce da realizzare se l'api è semplice
Contro: la dichiarazione pinvoke può essere complessa da scrivere. Le 
performance non sono le migliori
2. Usare C++/CLI per realizzare un "gateway". Le estensioni CLI di 
Visual C++ ti permettono di scrivere una dll che è in grado di parlare 
sia con il mondo nativo che managed.
Pro: ottieni le performance migliori
Contro: devi studiarti le estensioni CLI e capire bene come fare il 
marshalling dei parametri
3. Wrappare il codice C dentro un oggetto COM
I progetti managed possono facilmente aggiungere una reference ad un 
oggetto com ed utilizzarlo perché sfruttano i metadati presenti dentro 
la type library dell'oggetto COM.
Pro: semplice da usare nel mondo nativo. Puoi lavorare in modo OOP in 
quanto hai un vero oggetto e quindi di gestire il ciclo di vita di 
quell'oggetto.
Contro: Il mondo com ti obbliga a registrare il componente. I tipi 
utilizzabili nel mondo COM sono ristretti ad un set ridotto. Le 
performance non sono le migliori
In giro troverai centinaia di risorse su ognuna delle soluzioni ...
-- 
Raffaele Rialdi  
http://www.iamraf.net
Weblog: 
http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - 
http://www.ugidotnet.org/

> Ci sono almeno tre soluzioni:
Ok, ma sono tutte comunque possibili solo a patto che i sorgenti c/c++
siano su una dll.
Cercavo qualcosa che mi permettesse di scrivere parte di una funzione
o di un oggetto, ad esempio, in c# e parte in c/c++
E' possibile?
Qualcosa del tipo
#language c#
...
...
#language c
...
#language c#
#language VB
ecc..


Non è una scelta dettata dalla follia di qualcuno ma devi fare i conti 
con le specifiche dei linguaggi C e C++.
I problemi:
- C++ non ha un formato binario standard, quindi non puoi esporre una 
classe se non a codice che venga compilato con la stessa versione del 
compilatore.
- Per il C puoi farlo, ma ti limiti ad esporre funzioni (API). Le lib 
non hanno un formato 'standard' quindi la soluzione è la dll
- Come conciliare la mancanza di metadati di C/C++ con i requisiti del 
CLR? Come fai a dire che un char* sia una stringa o una struttura 
complessa? (e gli esempi sono infiniti).
Quindi l'unico modo per "arricchire" l'output della compilazione C++ 
con questi metadati è di usare le type library com oppure le estensioni 
CLI. Grazie a quei metadati il CLR capirà cosa vuoi fare.
Ancora una volta però il problema è di capire *dove* metti quei 
metadati ... e la dll è la soluzione.
C'è un ultimo caso che ho mostrato molto tempo fa in una sessione:
- se usi VC++ e compili con le estensioni CLI (/clr)
- se usi il linker a mano (visual studio non lo supporta ma puoi 
lanciare custom action dgli eventi di build)
In quelle condizioni puoi linkare gli obj C++/CLI con il codice IL 
prodotto da CSC (C#) e ottenere un unico exe o dll. È laborioso ma 
funziona.
