Come gestire lo sviluppo di PowerShell con le versioni x86 e x64 snap-in
-
30-09-2019 - |
Domanda
Al momento sto scrivendo uno snap-in PowerShell con dipendenze specifiche degli impianti di modalità mista (assemblee contenenti codice nativo) che colpiscono specificamente x64 o x86. Ho entrambe le versioni del assembly dipendente, ma mi chiedo il modo migliore per gestire la generazione e la distribuzione di questo snap-in, in particolare:
- E 'necessario disporre di due versioni della snap-in, uno x86 e uno x64, e utilizzare le due diverse versioni di installutil per installarlo, una volta per ogni architettura?
- Supponendo 1 # è vero, è consigliabile installare le due diverse versioni dello snap-in nei vari "Programmi" e "Program Files (x86)" directory?
- Qual è l'ideale (minimo fastidio) modo per strutturare un paio di progetti che condividono tutto, ma un unico riferimento, al fine di costruire per le due architetture differenti?
- Se lo snap si compila come "AnyCPU", e le DLL dipendenti sia caricato nel GAC, sarà il carico runtime il corretto montaggio dal GAC basata sull'architettura dell'host PowerShell attualmente in esecuzione?
- C'è un modo chiazza di petrolio in modo dinamico, in fase di esecuzione, scegliere quale dipendente dll a carico (se non può, per vari motivi, essere installato nella GAC) senza incorrere in mal di testa con i contesti di carico montaggio?
Soluzione 2
Ho finito per creare un modulo (grazie, Richard!), Ma che non ha risolto i problemi legati alla architettura di processore. Al fine di risolvere questo, ho messo entrambe le versioni del DLL dipendente nella directory di modulo e nel costruttore di ogni cmdlet ho messo un po 'di codice di inizializzazione (che gira solo una volta) per caricare la versione appropriata del DLL dipendente.
Grazie, tutti, per i puntatori.
Altri suggerimenti
Mark, abbiamo questa stessa situazione con le estensioni di PowerShell comunitari con le versioni a 32-bit e 64-bit di 7zip.dll. Si può piuttosto facilmente aggirare il problema PInvoking a LoadLibrary presto nella vostra startup snap-in (o prima è necessario chiamare fuori alla DLL nativa). È quindi possibile verificare se sei un processo a 32 bit o 64 bit (IntPtr.Size) e poi caricare manualmente la DLL corretto utilizzando il LoadLibrary PInvoke. Dopo che il, DllImport ( "YourNative.dll") noteranno che la DLL è già caricato e l'uso che DLL.
Date un'occhiata a questi due file di codice sorgente PSCX: http://pscx.codeplex.com/SourceControl/changeset/ view / 74.794? ProjectName = Pscx # 1.358.100 http://pscx.codeplex.com/SourceControl/changeset/ view / 74.794? ProjectName = Pscx # 1.358.102