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:

  1. 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?
  2. Supponendo 1 # è vero, è consigliabile installare le due diverse versioni dello snap-in nei vari "Programmi" e "Program Files (x86)" directory?
  3. 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?
  4. 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?
  5. 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?
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top