2009-07-02 14 views
5

Soy bastante nuevo en Powershell y estoy trabajando en la configuración de mi archivo profile.ps1. Tengo algunos archivos DLL administrados que uso a menudo para mantener los procesos durante todo el día y me gustaría poder cargarlos con llamadas a funciones rápidas. Así que creé esta función en mi archivo PS1:Función Powershell devolver objeto instanciado ... ¿tipo de?

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

Luego, en Powershell, hago esto:

PS > $myLibInstance = LoadSomeDll 

El problema es que $ myLibInstance, a pesar de que parece estar cargado, no lo hace comportarse de la manera que lo espero o si lo haría si lo cargara explícitamente sin la función. Diga SomeLib.SomeObject tiene una propiedad pública de cadena "ConnectionString" que se carga a sí misma (desde el registro, yuck) cuando se construye el objeto.

PS > $myLibInstance.ConnectionString 
//Nothing returned 

Pero, si lo hago sin la función, así:

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

me sale esto:

PS > $myOtherLibInstance.ConnectionString 
StringValueOfConnectionStringProperty 

¿Por qué sucede esto? ¿Hay alguna manera de que pueda devolver un nuevo objeto instanciado de una función de Powershell?

Gracias de antemano.

Respuesta

10

El problema al que se está enfrentando es que su función original es devolver una matriz de objetos, ni un solo objeto.

Uno de los trucos de PowerShell es entender que en una función, cada instrucción que evalúa no un valor no nulo se escribirá en la canalización. El "valor" de retorno de una función es simplemente el contenido de la tubería.

La llamada a LoadFrom devuelve un conjunto. Entonces, el retorno real de la función LoadSomeDll es una matriz que contiene un ensamblaje y una instancia de su objeto. En realidad, está llamando a ConnectionString en el tipo Object [] y, por lo tanto, falla silenciosamente.

Intente cambiar la función a lo siguiente. Dejé intencionalmente la palabra clave return porque es confusa en el contexto de powershell.

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

Gracias de nuevo, JaredPar. Has sido mi salvador Powershell durante la última semana. –

+0

@PITADev, esencialmente has golpeado los mismos problemas que golpeé en mis primeros días de powershell en casi el mismo orden :). Es tan contra intuitivo a veces. – JaredPar

+0

+1 buena explicación. Me he encontrado con este problema también. –

Cuestiones relacionadas