我对Powershell很新,我正在设置我的profile.ps1文件。我有一些托管的DLL,我经常使用它来维护一整天的进程,我希望能够加载快速函数调用。所以我在ps1文件中创建了这个函数:
function LoadSomeDll
{
[System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll")
return new-object "SomeLib.SomeObject"
}
然后,在Powershell中,我这样做:
PS > $myLibInstance = LoadSomeDll
问题是$ myLibInstance虽然看起来像是被加载了,但它的行为方式与我预期的不同,或者如果我在没有该函数的情况下显式加载它的话。 Say SomeLib.SomeObject有一个公共字符串属性“ConnectionString”,它在构造对象时加载自身(来自注册表,yuck)。
PS > $myLibInstance.ConnectionString
//Nothing returned
但是,如果我没有这个功能就这样做,就像这样:
PS > [System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll")
PS > $myOtherLibInstance = new-object "SomeLib.SomeObject"
我明白了:
PS > $myOtherLibInstance.ConnectionString
StringValueOfConnectionStringProperty
为什么会这样?有没有办法可以从Powershell函数返回一个实例化的新对象?
提前致谢。
答案 0 :(得分:10)
您遇到的问题是您的原始函数返回的是对象数组,而不是单个对象。
PowerShell中的一个技巧是理解在函数中,每个不计算非void值的语句都将被写入管道。函数的返回“值”只是管道的内容。
对LoadFrom的调用返回一个程序集。因此,函数LoadSomeDll的实际返回是一个包含程序集和对象实例的数组。你实际上是在Object []类型上调用ConnectionString,因此它会无声地失败。
尝试将功能切换为以下内容。我故意停止关键字返回,因为它在powershell的上下文中令人困惑。
function LoadSomeDll
{
[System.Reflect.Assembly]::LoadFrom("c:\wherever\SomeLib.dll") | out-null
new-object "SomeLib.SomeObject"
}