呼叫C++;使用DLLImport从Powershell获取代码

呼叫C++;使用DLLImport从Powershell获取代码,powershell,Powershell,下面是我用来获取凭证的C代码。这是成功的 class ClassName { [DllImport("BinaryName.dll", EntryPoint = "GetCredentials")] static extern int GetCredentials(StringBuilder sbUser, StringBuilder sbPassword, string sKey); static bool MethodName() { int iSuccess =

下面是我用来获取凭证的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#中,此
$
不是可接受的参数名称

我们能做的就是带上你的护照

[DllImport("BinaryName.dll", EntryPoint = "GetCredentials")]
static extern int GetCredentials(StringBuilder sbUser, StringBuilder sbPassword, string sKey);
我们将通过调用字符串生成器的全名,然后将GetCredentials设置为公共方法来修改它

[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)

你什么意思,拿到证书?为什么不在powershell里做这件事呢。为什么要使用C?从错误消息中可以看出,
$
似乎导致了类型定义中的问题。如果你移除这个会发生什么?类型定义中的代码应该是C#,而不是PowerShell,因此
$
不能用作变量表示符。在a中,我做了类似的事情。@boxdog
$
在C变量名中无效。我同意ArcSet的观点,OP应该只使用
Get Credential
。我觉得这是个XY问题。