2009-07-02 18 views
5

Sono piuttosto nuovo di Powershell e sto lavorando alla configurazione del mio file profile.ps1. Ho alcune DLL gestite che uso spesso per mantenere i processi durante il giorno che mi piacerebbe poter caricare con chiamate di funzione veloci. Così ho creato questa funzione nel mio file ps1:Funzione Powershell che restituisce oggetto istanziato ... tipo?

function LoadSomeDll 
{ 
    [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") 
    return new-object "SomeLib.SomeObject" 
} 

Poi, in PowerShell, faccio questo:

PS > $myLibInstance = LoadSomeDll 

Il problema è che $ myLibInstance, anche se sembra essere caricato, non lo fa comportarsi come mi aspetto o se lo farebbe se lo carichi esplicitamente senza la funzione. Supponiamo che SomeLib.SomeObject abbia una proprietà di stringa pubblica "ConnectionString" che carica se stessa (dal registro, yuck) quando l'oggetto viene creato.

PS > $myLibInstance.ConnectionString 
//Nothing returned 

Ma, se lo faccio senza la funzione, in questo modo:

PS > [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") 
PS > $myOtherLibInstance = new-object "SomeLib.SomeObject" 

ottengo questo:

PS > $myOtherLibInstance.ConnectionString 
StringValueOfConnectionStringProperty 

Perché accade questo? Esiste un modo per restituire un nuovo oggetto istanziato da una funzione PowerShell?

Grazie in anticipo.

risposta

10

Il problema che si sta verificando è che la funzione originale restituisce un array di oggetti, non un singolo oggetto.

Uno dei trucchi in PowerShell è capire che in una funzione, ogni istruzione che non valuta un valore non vuoto verrà scritta nella pipeline. Il "valore" di ritorno di una funzione è semplicemente il contenuto della pipeline.

La chiamata a LoadFrom restituisce un assembly. Quindi il ritorno effettivo della funzione LoadSomeDll è un array contenente un assembly e un'istanza del tuo oggetto. In realtà stai chiamando ConnectionString sul tipo Object [] e quindi fallisce silenziosamente.

Provare a cambiare la funzione come segue. Ho intenzionalmente omesso la parola chiave return perché è confusa nel contesto di PowerShell.

function LoadSomeDll 
{ 
    [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") | out-null 
    new-object "SomeLib.SomeObject" 
} 
+0

Grazie ancora, JaredPar. Sei stato il mio salvatore PowerShell nell'ultima settimana. –

+0

@PITADev, hai essenzialmente colpito gli stessi problemi che ho riscontrato nei primi giorni di PowerShell quasi nello stesso ordine :). A volte è così poco intuitivo. – JaredPar

+0

+1 bella spiegazione. Ho riscontrato anche questo problema. –

Problemi correlati