Nel post precedente abbiamo visto come sia possibile firmare un assembly (la mia libreria M2Mqtt) per poterlo includere direttamente in un’immagine del sistema operativo Windows Embedded Compact 2013 e registrarlo nella GAC (Global Assembly Cache). Nel corso di questo post, vedremo come sia possibile realizzare un componente visibile nel catalog items di Platform Builder, attraverso il quale includere la nostra libreria nell’immagine in maniera molto semplice.
Creare un nuovo componente ? Le possibili soluzioni
Durante la generazione di un’immagine del sistema operativo Windows Embedded Compact 2013 per un target device, si pone molto spesso la necessità di aggiungere un nostro componente (un’applicazione, una libreria oppure un qualsiasi altro tipo di file) all’immagine stessa, senza attingere dal catalog items che il Platform Builder ci mette a disposizione, essendo appunto tale componente di nostra proprietà.
Purtroppo, in molti casi, la soluzione più semplice ma anche quella meno “elegante” consiste nel copiare il file da includere nella cartella del nostro OSDesign (solution del sistema operativo) e modificare il corrispondente BIB file per impostarne l’inclusione nell’NK.bin generato. Addirittura, in molti casi si sceglie di definire l’inclusione a livello di BSP e non in termini di singolo OSDesign, influenzando in questo modo tutti i progetti generati a partire dalla medesima BSP. A tutto ciò, dobbiamo aggiungere eventuali modifiche al REG file se il componente incluso prevede delle impostazioni nel registro di sistema ed una altrettanto eventuale modifica al DAT file se è necessario creare dei link al componente al di fuori della cartella \Windows (in cui sono riposti di default tutti i file di sistema). Infine, è necessario aggiungere una custom build action che permetta di copiare il file dalla nostra directory (che sia OSDesign o BSP) nella release directory, per permetterne l’inclusione nell’NK.bin finale.
La soluzione più “elegante” consiste nel creare un SubProject attraverso il Platform Builder ed effettuare tutti i passi suddetti utilizzando i suoi file di configurazione (BIB, REG, DAT, ..) oltre ai file batch per le custom actions. Inoltre, è possibile associare a quest’ultimo un file di catalogo in modo da far comparire il nostro componente nel catalog items e permettere ad uno sviluppatore di terze parti di includerlo banalmente nell’immagine del sistema operativo.
Tutti questi passi risultano ripetitivi e sarebbe utile avere a disposizione un tool che li automatizzasse per noi; questo tool esiste e si chiama “Windows Embedded Compact (CE) Component Wizard” (noto come CEComponentWiz). E’ stato sviluppato da Samuel Phung e David Jones, è disponibile su CodePlex e rende estremamente semplice tutta la procedura di cui abbiamo appena parlato.
Installiamo il CEComponentWiz
Abbiamo a disposizione due modalità di installazione : come tool, accessibile nel menu Tools di Visual Studio 2012, oppre come PB script, accessibile nel menu Tools –> Platform Builder. Nel primo caso, al termine dell’installazione dobbiamo aggiungere manualmente il tool al menu nel modo seguente :
-
Selezionare “External Tools” dal menu Tools di Visual Studio 2012;
-
Aggiungere un nuovo tool ed impostare :
-
il titolo (es. CEComponentWiz)
-
selezioniamo l’eseguibile all’interno della cartella di installazione;
-
specifichiamo $(ProjectFileName) $(ProjectDir) come argomento (attenzione allo spazio tra i due parametri);
-
impostiamo $(TargetDir) come directory iniziale;
In questo modo, il tool sarà visibile nel menu ed attivabile una volta selezionato il progetto del sistema operativo dal Solution Explorer.
Nel secondo caso, viene installato un file PB script nella cartella PBScripts nei Documenti che ha il compito di lanciare il CEComponentWiz attraverso Visual Studio 2012. Per attivare questo script è necessario avviarlo una prima volta attraverso il menu Tools –> Platform Builder –> Configure Scripts. Una volta eseguito, esso sarà disponibile nel medesimo menu come script attivo da poter eseguire.
Creazione del componente M2Mqtt
Per poter utilizzare il tool CEComponentWiz è necessario aprire un progetto OSDesign in Visual Studio 2012 e successivamente lanciare il tool stesso. Inoltre, dobbiamo predisporre il materiale che includeremo attraverso il componente generato. In questo caso, dobbiamo procurarci l’assembly della M2Mqtt library compilato per il .Net Compact Framework 3.9.
Avviamo il tool ed attraverso il menu GetContent –> Modules, selezioniamo il file da includere (in questo caso M2Mqtt.dll); nel caso di un assembly per il .Net Compact Framework 3.9 dobbiamo accertarci che esso sia incluso nella sezione FILES del BIB file e che la flag “C” (compressed) sia abilitata. Dovendo registrare l’assembly nella GAC è necessario modificarne il nome del modo seguente :
GAC_M2Mqtt_v3_0_0_1_cneutral_1.dll
Inoltre, utilizzando CEComponentWiz abbiamo la possibilità di impostare le chiavi di registro necessarie alla registrazione nella GAC che sono le seguenti :
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETCompactFramework\Installer\Assemblies\ROM]
“M2Mqtt, Version=3.0.0.1, Culture=neutral, PublicKeyToken=974d508d5b9f76a5″=multi_sz:”\\windows\\GAC_M2Mqtt_v3_0_0_1_cneutral_1.dll”,”M2Mqtt.dll”
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETCompactFramework\Installer\Assemblies\Global]
“M2Mqtt, Version=3.0.0.1, Culture=neutral, PublicKeyToken=974d508d5b9f76a5″=multi_sz:”\\windows\\GAC_M2Mqtt_v3_0_0_1_cneutral_1.dll”,”M2Mqtt.dll”
Creiamo un file .reg contenente le chiavi suddette (es. M2Mqtt_registry.reg) ed aggiungiamo questo file attraverso il menu GetContent –> Registry Entries.
Attraverso il menu Generate Component Project –> Component Details è possibile impostare il nome del progetto, una descrizione, un commento ed il produttore. Inoltre, attraverso la voce OS Version dobbiamo impostare 8.00 nel caso di Windows Embedded Compact 2013. Cliccando su Generate Development Component, il tool crea un subproject all’interno della cartella dell’OS Design corrente con tutti i file di configurazione necessari.
A questo punto possiamo aggiungere manualmente (con Add exisisting subproject) il subproject al nostro OS Design ma il tool ci fornisce l’ulteriore funzionalità di creazione di un componente nella directory WINCE800\3rdParty. In questo modo, se visualizziamo il catalog items ed eseguiamo il refresh, avremmo a disposizione il nostro componente da poter includere con un semplice click !
Con questo post siamo riusciti a realizzare un componente proprietario per il Platform Builder che possiamo distribuire a chiunque voglia includere nella propria immagine del sistema operativo la libreria M2Mqtt, in modo da averla onboard senza la necessità di doverla distribuire con la propria applicazione.