meta dati per questa pagina
  •  

#develop ed il Compact Framework

Da quando utilizzo #develop mi sono sempre chiesto come poter sviluppare applicazioni per palmari.

Da definizione il Compact Framework e' un subset del framework disponibile sui pc quindi doveva essere possibile, con poco sforzo, compilare un applicazione (ammesso di aver utilizzato solamente classi presenti sul compact framework) per poter essere utilizzata su un palmare.

La compilazione standard non e' compatibile con i palmari in quanto bisogna indicare al compilatore di utilizzare le classi specifiche.

Recuperare gli Assembly del Compact Framework

Recuperare gli assembly del compact framework e' piuttosto semplice, basta copiarsi gli assembly da un palmare sul pc e rinominarle.

Nel caso sul palmare non sia presente il compact framework e' necessario installarlo scaricando l'ultima versione dal sito della Microsoft.

Nel caso non si disponga di un palmare, sempre dal sito della Microsoft e' possibile scaricare l'emulatore (incluso negli embedded Visual Tools) ed utilizzare lo stesso, la procedura non cambia.

Gli assembly sono presenti come dll nella cartella \windows del dispositivo e si presentano con il nome che inizia con "GAC_".

Gli assembly devono essere copiati sul pc e rinominati. Per rinominarli e' necessario seguire la seguente logica:
1. eliminare la parte di nome relativa all'intestazione (GAC_)
2.eliminare la parte di nome relativa alla versione (es.: _v1_0_5000_0_cneutral_1)
Come esempio prendiamo il file <i>GAC_mscorlib_v1_5000_0_cneutral_1.dll</i> il file rinominato dovra' essere: mscorlib.dll

Compilare per Compact Framework

Il mio esempio si basa su un'applicazione molto semplice, una form che contiene una Label come questa:
sharpdevelopecf.applicazione.jpg

Eseguendo la compilazione standard viene in realta' eseguita un'istruzione di questo genere:

c:\windows\microsoft.net\framework\v1.1.4322\csc.exe 
    /noconfig 
    @c:\...\miaApp.rsp
    /target:winexe
    /debug+
    /optimize-
    /checked-
    /unsafe-
    /warnaserror-
    /warn:4
    /incremental+
    /out:c:\...\debug\miaApp.exe
    /res:c:\...\miaApp.MainForm.resources
    /r:c:\...\System.dll
    /r:c:\...\System.Drawing.dll
    /r:c:\...\System.Windows.Forms.dll
    c:\...\MainForm.cs
    c:\...\AssemblyInfo.cs

Come e' possibile notare si fa riferimento esplicito agli assembly del framework da utilizzare e' quindi, teoricamente, sufficiente sostituire i riferimenti in questione facendoli puntare agli assembly del compact framework precedentemente recuperati.

Per testare se era sufficiente ho utilizzato un comando di questo tipo:

c:\windows\microsoft.net\framework\v1.1.4322\csc.exe
    /noconfig
    /nostdlib
    /target:winexe
    /debug+
    /optimize-
    /out:c:\...\miaApp.exe
    /res:c:\...\miaApp.MainForm.resources
    /r:c:\CartellaClassiCompactFramework\mscorlib.dll
    /r:c:\CartellaClassiCompactFramework\System.dll
    /r:c:\CartellaClassiCompactFramework\System.Drawing.dll
    /r:c:\CartellaClassiCompactFramework\System.Windows.Forms.dll
    c:\...\MainForm.cs
    c:\...\AssemblyInfo.cs

Si puo' notare il parametro /nostdlib che, insieme a /noconfig, dice al compilatore di non utilizzare l'assembly standard o libreria di base (mscorlib.dll) ed e' quindi necessario specificarla manualmente.

In questo modo la compilazione genera un errore: CS0122: 'System.StathreadAttribute' is inaccessible due to its protection level, dobbiamo sempre ricordare che molti metodi e classi non sono disponibili nel compact framework, questo e' un esempio. Per risolvere questo problema basta commentare la riga [STAThread] salvare e ricompilare (manualmente).

Una volta ripompilato trovo una nuova serie di errori di definizioni mancanti e devo andare a commentare le seguenti righe di codice nel metodo InitilizeComponent:

    this.SuspendLayout();
    this.label1.Name = "label1";
    this.label1.TabIndex = 0;
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    this.Name = "MainForm";
    this.ResumeLayout(false);

A questo punto pero' la form non e' piu' visualizzabile in design in quanto e' stata modificata manualmente l'InitializeComponent.

In questo modo la compilazione appena fatta e' sfruttabile, oltre che su PC anche su palmare, pero' non era sufficiente ai miei scopi, io volevo compilare direttamente da #develop.

Come poter compilare direttamente da #develop per compact framework?
Come abbiamo visto prima dobbiamo indicare direttamente quali assembly utilizzare, per fare cio' e' sufficiente indicarli tra le referenze.
sharpdevelopecf.referenze.jpg

Come si puo' notare e' necessario referenziare anche l'assembly di base mscorlib.dll.
A questo punto nella fase di compilazione vengono copiati, insieme all'eseguibile creato gli assembly referenziati che possono essere tranquillamente rimossi o non distribuiti, presupponendo l'installazione del compact framework.
L'applicazione funziona indistintamente sia su pc che su palmari.
C'e' un inconveniente, durante la fase di compilazione vengono generati una serie di warning CS1595 di definizione multipla delle proprieta'/metodi utilizzati per risolverlo sono percorribili due strade:
1. abbassare il livello di warning (sconsigliata)
2. indicare di non utilizzare il riferimento a mscorlib.dll (consigliata)
sharpdevelopecf.parametro.jpg

Consiglio: suggerisco di inserire i riferimenti agli assembly del compact framework solamente al termine della fase di disegno di tutte le form utilizzate, atrimenti, una volta commentate le righe non valide nella InitializeComponent non sara' piu' possibile visualizzare la form stesse.

Potresti lasciare un commento se ti fossi autenticato.