Prima di tutto, non prendere il tuo codice C++ nativo e compilarlo come C++/CLI. Otterrai risultati orribili. In secondo luogo, non prendere il tuo codice C++ nativo funzionante e provare a tradurlo in C#, notando contemporaneamente i posti in cui utilizzare le librerie di classi di base, modificando la tecnica di accesso ai dati e modificando il paradigma dell'interfaccia utente da MFC a WPF. Spenderai molta energia per produrre, nel migliore dei casi, ciò che avevi prima.
Invece, prendi il tuo codice C++ nativo funzionante e rifattalo in modo da avere una o più librerie di "business logic". Se questi esistono già, potrebbero avere interfacce COM, potrebbero esporre alcune funzioni di tipo "extern C" o potrebbero esporre alcuni metodi di istanza C++. Nessun problema. Se non esistono già, hai due scelte. Se ci sono solo una manciata di metodi necessari al livello di presentazione, e prendono cose semplici come le stringhe, mettono alcune funzioni "extern C" nel posto come gateway per la logica di business. Ora puoi chiamare quelli dall'interfaccia utente gestita (VB o C#, Windows Form o WPF, qualunque cosa) usando P/Invoke. Se ci sono molte cose e vuoi organizzarle, o se hanno bisogno di prendere strutture o oggetti complessi, allora scrivi una classe o classi C++/CLI che possano parlare alle classi native C++ as-is mentre esponi le classi "public ref class" all'interfaccia utente gestita. Il C++/CLI renderà più semplici i problemi di marshalling e lifetime.
Per la nuova interfaccia utente, scriverla da zero, richiamando la logica aziendale dove necessario. Utilizza la vecchia interfaccia utente solo come guida per le funzionalità necessarie e per le convalide. Usa il "look and feel" della tua nuova tecnologia UI (WPF o altro) per costruire l'interfaccia utente stessa e non provare una conversione meccanica. Finirai per inseguire i pixel e lavorare di più del necessario se ti affidi troppo al vecchio ui. La vecchia app aveva 3 pulsanti e una casella di controllo? Grandi, 3 pulsanti con aspetto WPF e una checkbox dall'aspetto WPF in arrivo. Piuttosto passare ad un nastro mentre stai facendo il cambiamento? Belle. È ok per sembrare diverso quando hai finito.
Quindi si distribuiscono le librerie logiche aziendali native, ancora compilate come codice nativo, il wrapper C++/CLI se ne possiede uno e l'interfaccia utente gestita. Funzionerà per qualsiasi cosa eccetto il telefono.
Ho solo bisogno di dire ancora una volta NON PORTA la tua logica di lavoro C++ nativa in C# come parte della fase iniziale del progetto. Una volta terminato e funzionante, se hai una buona ragione di lavoro (come non vogliamo più spendere soldi per gli sviluppatori C++), puoi prenderlo in considerazione. Ma prima fallo funzionare usando interop. Questo ha il vantaggio che se la tua traduzione incasina la delicata logica aziendale scritta da persone che non sono più con te, facendo affidamento su sottigliezze C++ che il tuo team attuale non conosce, puoi ricorrere alle librerie avvolte per il resto dei tuoi giorni.
fonte
2011-01-11 22:22:52
@all: ulteriori dettagli sui miei prodotti VC++, questo prodotto è costituito dalla maggior parte dei concetti di OOP basati su Objective C implementati, ovvero circa 17 anni di prodotto di sviluppo. Il che significa essenzialmente molto codice con molti componenti. Recentemente il mio cliente mi ha chiesto di presentare una proposta per unire l'intero prodotto e la sua funzionalità con un altro prodotto .NET esistente e migliorarne le funzionalità. – KSH
@all: questo ci ha costretto a pensare a un approccio per affrontare il problema. Pianificazione per identificare singoli COM o DLL che sono in VC++ che può essere direttamente/tramite wrapper utilizzato all'interno di .NET funziona. Pianificazione per toccare questi moduli solo quando necessario. A parte la pianificazione di una completa riscrittura dell'interfaccia utente con nuovi elementi di framework. Ulteriori suggerimenti su interfaccia utente/codice/concetti potrebbero aiutare ad acquisire maggiori conoscenze .. – KSH