2013-08-21 6 views
5

Sono in corso la valutazione delle possibilità di implementare un'infrastruttura di plugin per un'applicazione nativa che consente di scrivere estensioni nel codice gestito. I plug-in funzioneranno su grandi buffer in virgola mobile (-ish) allocati nell'heap nativo che sono abbastanza costosi in termini di impronta di memoria da copiare. Di conseguenza un plugin dovrebbe essere in grado di operare direttamente sulla memoria nativa.Accesso alla memoria nativa in modo trasparente dall'assembly .NET

Per quanto ne so, è possibile accedere alla memoria nativa dal codice gestito utilizzando Unsafe Code and Pointers (a mio avviso questa è l'unica disposizione nel framework .NET per farlo). Per semplificare lo sviluppo di plugin, preferisco non esporre questo artefatto e fornire invece un meccanismo di proxy in modo da poter accedere ai buffer come raccolte gestite.

Non ci sono restrizioni all'implementazione (un livello di interoperabilità C++/CLI va bene, ad esempio) o una specifica versione di runtime .NET. I buffer possono essere anche di dimensioni fisse; il plugin modificherà solo i contenuti.

È possibile implementare un'infrastruttura che soddisfi i requisiti di cui sopra e, in caso affermativo, quali opzioni esistono?

+0

Scrivere una classe gestita che fornisca un'interfaccia adatta alla manipolazione di detto buffer? Detto classe userebbe puntatori e cose nelle sue viscere, ma esponeva solo bit gestiti in sicurezza. –

+0

è possibile fornire COM visibile e creare oggetti COM che si occupano del codice non gestito –

risposta

7

È possibile implementare un'infrastruttura che soddisfi i requisiti di cui sopra e, in caso affermativo, quali opzioni esistono?

Non sarà possibile trattare direttamente i dati nativi come array gestito, ma è possibile esporre un livello tramite C++/CLI che consente l'accesso diretto e indicizzabile a tale memoria.

Ad esempio, si supponga di disporre di un buffer composto da pochi milioni di valori in virgola mobile a precisione doppia. Puoi facilmente creare un C++/CLI ref class che espone una finestra su quel buffer tramite un indicizzatore o, ancora meglio, come IList<T>.

Ciò consentirebbe potenzialmente di essere utilizzato da C# come se fosse un normale IList<T>, senza copiare i dati, poiché la classe wrapper richiede solo le posizioni di memoria buffer memorizzate.

+0

Questo è essenzialmente ciò che cercavo, essendo in grado di leggere e scrivere nella memoria nativa senza inoltro di questa funzionalità come responsabilità. Sembra anche che non ci siano altre transizioni gestite non gestite coinvolte una volta che il wrapper C++/CLI sta costruendo un oggetto 'IList ' (potrei sbagliarmi). Ora sarebbe perfetto! – IInspectable

+0

@Il C++/CLI Invisibile, in pratica, deve eseguire alcune transizioni gestite/non gestite. Se lo fai, scoprirai che c'è un (molto leggero) sovraccarico quando si accede tramite una rotta gestita esclusivamente, ma questo di solito è decisamente migliore del costo di copiare la memoria, anche in blocchi. –

+0

@IInspectable Lo faccio nel mio progetto corrente un po ', in quanto è davvero l'unico modo per gestire in modo pulito dati molto grandi in un assembly in modalità mista. –