Oggi parleremo di un antipatico problema riguardante lo sviluppo di componenti custom per SQL Server Integration Services. Recentemente un cliente ha cominciato ad ottenere il seguente errore durante il debug di un integration service package:

Validation error. Data Flow Task: Data Flow Task: The component metadata for "YourComponentName, clsid {874F7595-FB5F-40FF-96AF-FBFF8250E3EF}" could not be upgraded to the newer version of the component. The PerformUpgrade method failed.                             

Fortunatamente il package continuava a funzionare in produzione.

Il problema, nel caso del cliente, è stato sollevato dal fatto che la DLL col componente custom è stata ricompilata specificamente per la piattaforma X64. Dato che il runtime di SSIS è a 64bit il componente funzionava se invocato direttamente da DTExec. Ma perché non funzionava in debug dentro l’IDE? Perché – come dettagliato in questo eccellente post: http://social.technet.microsoft.com/wiki/contents/articles/ssis-64-bit-story.aspx - i data tools di SQL Server sono a 32 bit. L’immagine sottostante mostra quanto detto (l’immagine è la form di Attach to process di Visual Studio 2012):  

Provando a compilare a 32 bit non avreste i problemi nell’IDE. Questo almeno fino a che proverete a testare il componente. L’IDE instanzierà un processo di DTExec (o, meglio, una versione di debug equivalente) a 64 bit: 

 E a questo punto avreste l’errore di validazione a runtime:

 La morale è: se non avete bisogni particolari compilate (e registrate in GAC) con target MSIL in Visual Studio:

Inoltre, se volete fare debug del vostro componente a runtime, non dovete attaccarvi al processo dell’IDE ma al processo da questo generato.

Se volete una prova ulteriore potete usare il metodo

System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")

per sapere se siete in un processo 32 o 64 bit. Come vedrete – facendo debug – i vostri metodi verranno chiamati prima come 32 bit e poi come 64.

Un elenco – non esaustivo – del workflow delle chiamate può essere simile a questo: 

Dove nel metodo Validate ho estratto la piattaforma. Notate come eseguendo il debug del SSIS nei Data Tools il metodo Validate viene chiamato prima dall’IDE (processo devenv a 32bit) e in seguito da DtsDebugHost a 64bit. Ovviamente l’id di processo sarà diverso caso per caso.

 Happy Coding,

Francesco Cogno