我想在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
...
如何调用这些会员功能?
为什么我不能按照我期望的方式打电话给他们?
答案 0 :(得分:1)
使用反射我看到Pkcs12ProtectedConfigurationProvider
类标记为internal
并且没有显式构造函数。我能够通过调用唯一(空)Invoke
method上的constructor
来实例化它:
$type = Add-Type -Path 'PKCS12ProtectedConfigurationProvider.dll' -PassThru;
$emptyConstructor = $type.DeclaredConstructors[0];
$provider = $emptyConstructor.Invoke($null);