【问题标题】:Call C++ code from Powershell using DLLImport使用 DLLImport 从 Powershell 调用 C++ 代码
【发布时间】:2019-02-05 13:27:00
【问题描述】:

下面是我用来获取凭据的 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 中完成整个事情。为什么要使用 C#
  • 从错误消息看来,$ 导致您的类型定义出现问题。如果你删除它会发生什么?类型定义中的代码应该是 C#,而不是 PowerShell,因此 $ 不能用作变量指示符。在previous answer 我做类似的事情。
  • @boxdog $ 在 C# 变量名中无效。我在这里同意 ArcSet,OP 应该只使用Get-Credential。我觉得这是一个 XY 问题。

标签: powershell


【解决方案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 设为公共方法来修改它以使其工作

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多