La domanda è chiaramente come integrare il proprio codice C++ per la sua soluzione C#, non solo quello che attributo da utilizzare al fine chiamare una funzione esistente dall'API win32. Anche se la risposta fosse già stata accettata, ritengo che sia incompleta e che si dovrebbe applicare quanto segue.
Sì, è pratica comune nei casi in cui l'attività può essere eseguita più velocemente, utilizzare meno risorse e, in alcuni casi, accedere a metodi non disponibili nel framework .net.
Se il vostro obiettivo è quello di ottenere l'efficienza è necessario il codice nativo C++ non gestita biblioteca, si crea un nuovo progetto non gestito C++ (che compila come libreria DLL) in Visual Studio e riferimento questa libreria dal progetto C# .
Nel tuo caso sembra che potresti scrivere una libreria C++ non gestita e vale quanto segue.
Come per tutti i problemi immediati che stavi chiedendo su, ciò avrebbe un impatto sulla distribuzione e l'offuscamento.
Distribuzione: Tenete a mente che i C# DLL si costruisce verrà eseguito su qualsiasi CPU, sia a 32 che a 64 bit, ma questo nuovo C nativa e non gestito ++ biblioteca sarà costringerà il vostro programma per essere o per 32 o 64 specifici.
Questo è qualcosa che si configurare nel gestore di configurazione di Visual Studio, e saranno presi cura di in fase di compilazione tempo, si sceglie AnyCPU per C# assemblee e per il vostro nuovo C++ non gestita biblioteca, che sarà in è un progetto proprio, avrai da scegliere tra win32 o x64.
Così si avranno ora 2 setup, è consigliato migliori pratiche di avere configurazioni separate, una per 32 e un altro per 64. O da quando 32bit supporto sta cadendo molto veloce, si potrebbe concentrarsi su 64bit solo.
Inoltre, la libreria potrebbe terminare con riferimento al ridistribuibile VC++ fornito da Visual Studio, che potrebbe essere necessario includere nella distribuzione, anche se alcune versioni di esso sono incluse in molti sistemi operativi, ho riscontrato che è raramente la stessa che ho compilato con ed è meglio distribuirlo con la tua applicazione per essere sicuro. Se questo pacchetto è mancante, il computer di destinazione avrà un'eccezione SideBySide nel registro eventi-> registro applicazioni.
Per intercettare e gestire un'eccezione generata da codice non gestito, l'unica presa che funziona è quella vuota, quella senza eccezioni tra parentesi dopo il catch(). In questo modo è possibile racchiudere le chiamate in codice non gestito per gestire tutte le eccezioni non gestite generate dal codice non gestito, se si inserisce un tipo .net come catch (Exception), verrà semplicemente saltato sopra. L'unico modo per catturare un'eccezione non gestita, all'interno del codice gestito è in questo formato.
try
{
//call unmanaged code
}
catch
{
//handle unmanaged exception
}
- Obfuscation: Tutte le chiamate di metodo fatte da C#, che ora chiedono codice non gestito ormai escluse da rinominare automaticamente. E il rovescio della medaglia, se la libreria non gestito C++ deve di chiamare i metodi dei tuoi gestiti assemblee, chi sarà bisogno di essere esclusi da rinominare, manualmente, in modo da essere visibile alla libreria C++ chiamando loro.
Se quello che vi serve è solo quello di chiamare ben note librerie C++ come quelle di Windows, non sarà necessario creare un nuovo progetto non gestito C++, utilizzare solo il [DllImport()] attributo ha suggerito in una risposta precedente. E in questo caso si potrebbe dare un'occhiata a questo riferimento http://www.pinvoke.net/
Questa pubblicità è per .NET? Che dire della compatibilità multipiattaforma, dei problemi di connessione, della curva di apprendimento, ecc.? –
Curva di apprendimento? Suppongo tu sappia le basi di C++ e C# quando cerchi di combinare le lingue. Piattaforma incrociata? È ovvio che scrivere codice cross platform in C++ è molto più difficile, ma possibile. Sembra anche un po 'più facile quando combinato con C# - un codice di livello più alto può decidere quali parti di WHICH C/C++ caricare e utilizzare su una piattaforma specifica. – Harry
@Harry: accetterò la tua risposta quando mi mostrerai (ad es.) C# lavorando su un PIC ;-) –