我用 [System.Reflection.Assembly]::LoadFrom (\’D:\\Test\\DTS.dll‘)加载了dll 。
已经可用New-Object 建立dll内大部分类的对象了。
但是New-Object T2Sdk 这个类不行。
T2Sdk的构造函数是 T2Sdk([ IT2Handler hanler =null ]) ,
而IT2Handler 是接口 interface。
不知道这段T2Sdk t2sdk = new T2Sdk() 用powershell如何实现。
按照构造函数IT2Handler 是个可选参数应当可以不传。
另外在c#中任何时候都不能初始化一个接口,而是找到实现了该接口的非抽象类进行初始化,然后把初始化的对象用到需要它的接口的地方。
就像我在另一篇帖子system.string的方法问题中回答的一样,IConvertible.ToDateTime(System.IFormatProvider provider)中的IFormatProvider是一个接口,我们得找到或者初始化一个实现这个接口的个实例。
我在C#中模拟了这么一段定义:
public interface IT2Handler { } public class T2Sdk { public T2Sdk(IT2Handler handler=null) { } }
然后在PowerShell中实验的结果如下:
[PStips.Net.IT2Handler]$handler PS> New-Object PStips.Net.T2Sdk -ArgumentList @($handler) PStips.Net.T2Sdk PS> New-Object PStips.Net.T2Sdk -ArgumentList @($null) PStips.Net.T2Sdk PS> New-Object PStips.Net.T2Sdk -ArgumentList $null New-Object : A constructor was not found. Cannot find an appropriate constructor for type PStips.Net.T2Sdk. At line:1 char:1 + New-Object PStips.Net.T2Sdk -ArgumentList $null + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (:) [New-Object], PSArgumentException + FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand
这说明一个问题,如果给New-Object 不传参数,或者传递一个null,PowerShell解释器都会认为你调用的无参数构造函数,显然该类型没有无参数构造函数。所以至少需要我们传递一个数组,数组中可以只包含一个元素,哪怕那个元素是null。这样Powershell解释器就会匹配那个有一个参数的构造函数。
形如:PS> New-Object PStips.Net.T2Sdk -ArgumentList @($null)
或者:New-Object PStips.Net.T2Sdk -ArgumentList @($handler)
感谢回复。
我直接用 new-object T2Sdk 不带参数的时候,ps会报不存在对应的构造函数(唯一的构造函数是public T2Sdk([IT2Handler handler = null]) ,是不是ps不支持默认参数?怎么给对象赋值为null?)
这个参数默认是null,应该没有“实现这个接口的个实例”,类似ToDateTime(System.IFormatProvider provider)中的IFormatProvider。
c#代码里原来代码是这样的,T2Sdk t2sdk = new T2Sdk()。
然后我改成T2.IT2Handler hdl = null;
T2Sdk t2sdk = new T2Sdk(hdl)
也是可以编译通过的。我在想ps能不能仿写这段。
c#我比较模糊,我想法是调用dll里的通讯方法,通过ps去处理数据。
已在原答案上更新。
非常感谢大牛,就是 -ArgumentList @($null) 。
看来我应该多补补ps基础,之前我怎么试,也没想到用@($null)。