如何添加此程序集并在Powershell中使用其功能?

时间:2014-10-21 18:06:19

标签: powershell

我想在Powershell中使用Pkcs12ProtectedConfigurationProvider DLL。特别是,我想实例化它的类并在Powershell中调用该类的Encrypt()和Decrypt()方法,因此我可以编写加密和解密Web.config连接字符串的函数。

如果我在dotPeek中检查DLL,我看到它定义了一个名称空间PKCS12ProtectedConfigurationProvider,并且该名称空间中的一个类具有相同的名称。

我希望能够添加该类型,然后根据我在Web上阅读的有关其他程序集的内容实例化该类。 This page on using WinSCP with Powershell只是一个例子。

我可以添加没有问题的类型。

PS> $asmPath = "C:\ProgramData\chocolatey\lib\Pkcs12ProtectedConfigurationProvider.1.0.1\lib\NET40\PKCS12ProtectedConfigurationProvider.dll"
PS> Add-Type -Path $asmPath

但是,我无法创建对象

PS> new-object PKCS12ProtectedConfigurationProvider.PKCS12ProtectedConfigurationProvider
new-object : Cannot find type [PKCS12ProtectedConfigurationProvider]: verify that the assembly containing this type is loaded.

我可以看到它实际上已经加载了

PS> $asm = [appdomain]::CurrentDomain.GetAssemblies() |? { $_.Location -eq $asmPath }
PS> $asm

GAC    Version        Location
---    -------        --------
False  v4.0.30319     C:\ProgramData\chocolatey\lib\Pkcs12ProtectedConfigurationProvider.1.0.1\lib\NET40\PKCS12ProtectedConfigurationProvider.dll

PS> $asm.FullName
PKCS12ProtectedConfigurationProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34da007ac91f901d

而且,如果我使用-PassThru添加类型,我可以看到它确实在某个地方有我想要的成员函数(成员列表被剪掉了长度):

PS> $type = Add-Type -Path $asmPath -PassThru
PS> $type.GetMembers() | Select-Object name,membertype,declaringtype,module

Name         MemberType   DeclaringType                                                               Module
----         ----------   -------------                                                               ------
...
Initialize       Method   Pkcs12ProtectedConfigurationProvider.Pkcs12ProtectedConfigurationProvider   PKCS12ProtectedConfigurationProvider.dll
Decrypt          Method   Pkcs12ProtectedConfigurationProvider.Pkcs12ProtectedConfigurationProvider   PKCS12ProtectedConfigurationProvider.dll
Encrypt          Method   Pkcs12ProtectedConfigurationProvider.Pkcs12ProtectedConfigurationProvider   PKCS12ProtectedConfigurationProvider.dll
...

如何调用这些会员功能?

为什么我不能按照我期望的方式打电话给他们?

1 个答案:

答案 0 :(得分:1)

使用反射我看到Pkcs12ProtectedConfigurationProvider类标记为internal并且没有显式构造函数。我能够通过调用唯一(空)Invoke method上的constructor来实例化它:

$type = Add-Type -Path 'PKCS12ProtectedConfigurationProvider.dll' -PassThru;
$emptyConstructor = $type.DeclaredConstructors[0];
$provider = $emptyConstructor.Invoke($null);