使用DLLImport从Powershell调用C ++代码

问题描述 投票:-1回答:1

下面是我用来获取凭据的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
powershell
1个回答
1
投票

好,让我们谈谈出什么毛病

[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)
© www.soinside.com 2019 - 2024. All rights reserved.