2012-04-04 10 views
5

Abbiamo un grande progetto scritto principalmente in C# (servizi, multithreading ecc.). Tuttavia, gli algoritmi di crunch del core number sono scritti in C++ non gestito per essere veloci (OpenMP ecc.).Utilizzare le proprietà C# nel codice C++ non gestito

Purtroppo, al momento dobbiamo fare un grande sforzo per scambiare dati tra questi due mondi. Ad esempio, dobbiamo scrivere classi di wrapping in C++/CLI per ciascuna delle classi C++. Per (praticamente) qualsiasi impostazione richiesta (Proprietà) nel C# - "mondo" c'è una copia nel mondo C++ (un file di intestazione) e una conversione esplicita avanti e indietro nella classe wrapper. Questa architettura sembra molto inefficiente e abbastanza soggetta a errori.

domanda primaria: C'è un modo per condividere un C# -class con proprietà in qualche modo automaticamente in C++ non gestito? (dobbiamo leggere e scrivere!)

Domanda secondaria: Puoi fornire qualche consiglio su come migliorare l'architettura in un caso come descritto sopra. Una nostra considerazione è stata quella di passare completamente al C++, ma trovare le librerie appropriate e scrivere codice pulito per tutte le cose (di sistema) che facciamo in .NET al momento non si sentono bene.

Molte grazie per il vostro aiuto e saluti, Jakob

+0

Hai verificato che scrivere gli algoritmi in C# è un collo di bottiglia? C# 4.0 ha un buon supporto per lo sviluppo parallelo ora. – Nick

+0

No, non l'abbiamo ancora fatto, e hai ragione: dovremmo fare un tentativo per essere sicuri di questo punto. Ma poiché ci affidiamo a particolari proprietà del caching della memoria e simili, dubito davvero che l'algoritmo funzioni con una velocità simile nel CLR. –

+2

Cosa ne pensi di [Protocol Buffers] (http://code.google.com/p/protobuf/)? C'è la possibilità di usarlo insieme a C# usando [protobuf-net] (http://code.google.com/p/protobuf-net/). – megabyte1024

risposta

1

ho a che fare con problemi simili al mio lavoro dove il mio compito primario è quello di scrivere interfacce gestite per certo alto perfromance, DLL a bassa latenza, si tratta di casi semplici dove devo racchiudere le classi native usando semplici C++/cli contenenti un puntatore raw alla classe nativa o problemi più complessi in cui il codice nativo è un editore lato server e il codice gestito deve iscriversi usando i delegati, cioè devono essere convertito in callback nativi. .NET under the hood è un server COM sofisticato per quanto ne so. È possibile scrivere .net assembly con l'attributo ComVisible impostato su true, che funge da componente COM classico e quindi è possibile utilizzarlo dal codice C++ nativo come componente COM. Il contrario che consiste nell'utilizzare il codice nativo da gestito può essere ottenuto utilizzando gli attributi DllImport e tutto il marshalling può essere regolato dai vari attributi come StructLayoutAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx) e MarshalAsAttribute (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) Sto anche utilizzando a volte la parola chiave non sicura anche. Ho a che fare con il codice ad alte prestazioni quindi in alcuni casi è che dopo la profilazione so che è la soluzione migliore. Che si tratti della soluzione di classe warpper che hai menzionato o del classico modo COM, o di un qualche tipo di ibrido con cache, pooling di oggetti, ecc.

Spero che questo aiuti. :)

Ci scusiamo se sembra un po 'disorganizzato. È molto tardi qui. :)

+0

Grazie per la tua risposta - Ho già ripulito gran parte del nostro codice wrapper usando Marhsal.StructToPtr e compagni, e spero di ottenere ancora di più usando componenti C++/CLI sia in C# che in mondi C++ nativi ... –

+0

Grazie Jakob S. – ervinbosenbacher

Problemi correlati