下面是我用来获取凭据的C#代码。成功。
class ClassName
{
[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
static extern int GetCredentials(StringBuilder sbUser, StringBuilder sbPassword, string sKey);
static bool MethodName()
{
int iSuccess = 0;
StringBuilder sUser = new StringBuilder(256);
StringBuilder sPwd = new StringBuilder(256);
iSuccess = GetCredentials(sUser, sPwd, "KeyValue");
}
}
下面是模仿上面的c#代码以获取证书的powershell代码
$args1 = ""
$args2 = ""
$args3 = "KeyValue"
$GetCredentials = @'
[DllImport("C:\\Path\\BinaryName.dll", EntryPoint = "GetCredentials", ExactSpelling=false)]
public static extern int GetCredentials([out] [MarshalAs(UnmanagedType.LPStr)] out String $args1, [out] [MarshalAs(UnmanagedType.LPStr)] out String $args2, [In] String $args3);
'@
$typeFunc = Add-Type -MemberDefinition $GetCredentials -Name "GetCredentials" -PassThru -Namespace System.Runtime.InteropServices
$ret = $typeFunc::GetCredentials($args1, $args2, $args3)
获取以下错误消息。请帮助我
Add-Type : c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(9) : Unexpected character '$'
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(8) : [DllImport("C:\\Path\\BinaryName.dll", EntryPoint = "GetCredentials", ExactSpelling=false)]
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(9) : >>> public static extern int GetCredentials([MarshalAs(UnmanagedType.LPWStr)]StringBuilder $args1, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder $args2,
[MarshalAs(UnmanagedType.LPWStr)]String $args3);
c:\Users\AppData\Local\Temp\bzhzifxk\bzhzifxk.0.cs(10) :
At line:8 char:13
+ $typeFunc = Add-Type -MemberDefinition $GetCredentials -Name "GetCred ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand
好,让我们谈谈出什么毛病
[DllImport("C:\\Path\\BinaryName.dll", EntryPoint = "GetCredentials", ExactSpelling=false)]
public static extern int GetCredentials([out] [MarshalAs(UnmanagedType.LPStr)] out String $args1, [out] [MarshalAs(UnmanagedType.LPStr)] out String $args2, [In] String $args3);
我们首先得到$的错误。
原因是因为您正在编译c#代码。在C#中,此$
不是可接受的参数名称。
我们能做的就是获取您的c#DLLImport
[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
static extern int GetCredentials(StringBuilder sbUser, StringBuilder sbPassword, string sKey);
我们将通过在字符串生成器上调用全名,然后将GetCredentials设置为Public方法来对其进行修改,以使其工作
[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
public static extern int GetCredentials(System.Text.StringBuilder sbUser, System.Text.StringBuilder sbPassword, string sKey);
所以整个代码应该看起来像
$args1 = ""
$args2 = ""
$args3 = "KeyValue"
$GetCredentials = @'
[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
public static extern int GetCredentials(System.Text.StringBuilder sbUser, System.Text.StringBuilder sbPassword, string sKey);
'@
$typeFunc = Add-Type -MemberDefinition $GetCredentials -Name "GetCredential" -PassThru -Namespace System.Runtime.InteropServices
$ret = $typeFunc::GetCredentials($args1, $args2, $args3)