Condivisione codice con progetti Compact

lunedì 20 novembre 2006 - 10.09

fabrizi0 Profilo | Newbie

Ciao a tutti, sono nuovo di questo forum, spero di non chiedere cose troppo ovvie o troppo discusse. :-)
Ho fatto il porting di una applicazione su compact framework e mi sono reso conto di non saper come fare a condividere delle librerie tra i due progetti. Non ho molta esperienza con vs2005.

Queste librerie (non form) sono praticamente invariate tra i due framework (qualche ottimizzazione in meno su Compact), mi basterebbe poter mettere qualcosa del tipo:
#ifndef Compact
ottimizzazione()
#endif
e far appartenere lo stesso file cs ai due progetti. (al limite con un link svn o sourcesafe.)

Sarebbe bello tuttavia se ci fosse qualche sorta di compilazione condizionale, che mi permetta di non dover duplicare il codice o pasticciare con i file. Qualcuno può consigliarmi come proseguire?

Grazie in anticipo per ogni aiuto.

--
Fabrizio

Brainkiller Profilo | Guru

>Sarebbe bello tuttavia se ci fosse qualche sorta di compilazione
>condizionale, che mi permetta di non dover duplicare il codice
>o pasticciare con i file. Qualcuno può consigliarmi come proseguire?

Ma questa libreria esterna varia molto ? Non puoi semplicemente (come fanno molti) una volta che è terminato lo sviluppo blindarla, compilandola e distribuendo il binario (dll) e tutti quelli che ci lavorano sopra ?

E in seguito se ci sono update da fare, la ricompili e distribuisci nuovamente la DLL a chi ci lavora sopra ?

Sbaglio ?
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

fabrizi0 Profilo | Newbie


>Ma questa libreria esterna varia molto ? Non puoi semplicemente
>(come fanno molti) una volta che è terminato lo sviluppo blindarla,
>compilandola e distribuendo il binario (dll) e tutti quelli che
>ci lavorano sopra ?
>E in seguito se ci sono update da fare, la ricompili e distribuisci
>nuovamente la DLL a chi ci lavora sopra ?

Ciao David, Grazie della risposta.
Temo di non essere riuscito a spiegare quale sia il mio problema o forse non ho capito la risposta.
Cerco di riformulare la mia domanda.

Ho sviluppato una libreria di conversioni GIS che deve essere integrata in due progetti distinti: un windows form per XP (.net 2.0) e uno per pocketpc (compact framework 2.0).
La libreria è ancora in sviluppo (oltrettutto congiunto, devo usare subversion per la sincronizzazione aziendale), attualmente devo fare così: gestisco due progetti distinti, copio a mano i file cs da una parte all'altra, li modifico per ovviare alle incompatibilità dei frameworks.

C'è una maniera migliore per farlo?
C'è la maniera per dire che un certo pezzo di codice deve essere compilato solo con Compact Framework e non con il framework per windows?

Grazie di nuovo.
--
Fabrizio

Brainkiller Profilo | Guru

>C'è una maniera migliore per farlo?
>C'è la maniera per dire che un certo pezzo di codice deve essere
>compilato solo con Compact Framework e non con il framework per
>windows?

Scusa ora penso di aver capito. Non sono sicuro della risposta, ma non credo che la compilazione condizionale così come è intesa normalmente ti consenta di fare questa operazione. Secondo me in questo caso la libreria dev'essere ramificata in due progetti una ottimizzata per PocketPC e una per Windows Forms. Considerato che il Compact Framework è molto Compact, conviene ramificare.

Quindi il tuo lavoro di copia dei cs si rende necessario perchè viene sviluppata la library per Windows Forms, poi viene copiata sui progetti pocketpc e provvedi a modificarla togliendo tutte le chiamate a classi o metodi non supportati dal CF ?

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

fabrizi0 Profilo | Newbie

>Scusa ora penso di aver capito. Non sono sicuro della risposta,
>ma non credo che la compilazione condizionale così come è intesa
>normalmente ti consenta di fare questa operazione. Secondo me
>in questo caso la libreria dev'essere ramificata in due progetti
>una ottimizzata per PocketPC e una per Windows Forms. Considerato
>che il Compact Framework è molto Compact, conviene ramificare.
>
>Quindi il tuo lavoro di copia dei cs si rende necessario perchè
>viene sviluppata la library per Windows Forms, poi viene copiata
>sui progetti pocketpc e provvedi a modificarla togliendo tutte
>le chiamate a classi o metodi non supportati dal CF ?

Esattamente! Parte del problema potrebbe essere risolto se riuscissi ad effettuare le compilazioni condizionali.
Ho visto che c'è un costrutto [Conditional], non ho ancora provato ad usarlo, ma ho la sensazione che potrebbe fare al caso mio.
Dovrei riuscire a fare una cosa del tipo:

[Conditional("CompactFrameworkOrWathever")] public void Init( ) { this.compactframework=true; }

Se riuscissi a fare così allora potrei avere un unico file da copiare con una procedura batch nei due progetti, che potrei mantere distinti, come male minore.

Di fatto ho avuto la fortuna di riuscire a fare il porting a CompactFramework abbastanza agilmente, mi dispiacerebbe non sfruttare l'occasione.

:-)

Ciao!

--
Fabrizio


Brainkiller Profilo | Guru

>Ho visto che c'è un costrutto [Conditional], non ho ancora provato
>ad usarlo, ma ho la sensazione che potrebbe fare al caso mio.

Non mi sembra serva a quello. La documentazione dice "Methods decorated with the ConditionalAttribute attribute are always compiled into Microsoft intermediate language (MSIL), but calls to the methods can not be made at run time. If the method has arguments, they are type-checked at run time, but not evaluated.".

Ho riguardato nel frattempo il tuo primo Post. Forse così potrebbe andare bene. Creando due configurazioni (tipo Debug e Release) ne crei una aggiuntiva Compact Framework e nel codice utilizzi gli #if then #else.

A quel punto quando scegli la configurazione "Compact Framework" verrà compilato solo il codice corretto (quello solo del Compact Framework) oppure l'altro.
Tu hai già provato questo sistema ? Ti sembra funzionare ?

Ciao



David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

fabrizi0 Profilo | Newbie

>Ho riguardato nel frattempo il tuo primo Post. Forse così potrebbe
>andare bene. Creando due configurazioni (tipo Debug e Release)
>ne crei una aggiuntiva Compact Framework e nel codice utilizzi
>gli #if then #else.
>
>A quel punto quando scegli la configurazione "Compact Framework"
>verrà compilato solo il codice corretto (quello solo del Compact
>Framework) oppure l'altro.
>Tu hai già provato questo sistema ? Ti sembra funzionare ?

Eccolo! Bene, un passo in avanti significativo. Proprio coì non va, ma basta poco per farlo andare.
( Non sapevo esistessero i comandi di preprocessione #if #else e #endif.)
Adesso devo capire quale define è presente nel compact framework che non c'è nella windows form e il gioco è praticamente fatto.

Ho visto che la define che sto cercando dovrebbe essere "PocketPC" .
Comunque sia, credo che la soluziona sia: creo due progetti diversi, uno compact e uno no, nei quali i file condivisi di fatto "puntano" allo stesso file, cosa che si può fare, credo, con subversion, ottimo sostituto gratuito di sourcesafe.

Con:

#if PocketPC PocketOptimize() #else Default() #endif

includo o escludo parti di codice.

Mi ci metto subito.

Grazie, e complimenti per il forum.
--
Fabrizio
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5