“无法找到重载...”在'新'方法 - Powershell reflection.assembly实例化VB.NET类

时间:2017-07-13 15:24:05

标签: vb.net powershell constructor

我有一个.NET EXE文件,它有两个“新”方法;一个New方法接受四个参数,另一个不接受任何参数。

最终目标是能够通过Powershell或其他.NET应用程序引用此EXE,以传递这4个参数,因此无需与窗口交互,同时仍能够手动启动应用程序和与之互动。

我的方法如下(目前没有做任何参数,没有那么远):

Public Sub New(OrganizationName As String, ExpirationDate As String, ProductID As String, SerialNumber As String)

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub
Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.

End Sub

我从Powershell脚本引用已编译的EXE来测试此,似乎无法这样做。

当我尝试将这些参数传递给类时,我收到一条错误消息,指出在此参数数量下无法发现重载。

我的powershell脚本:

[reflection.assembly]::LoadFile("app.exe")
$App = New-Object App.AppMain("Test", "01/01/2017", "1001", "1234")

在上面的示例中,“App.exe”是我编译的EXE的完整文件路径,“App”是项目名称的子项。 'AppMain'是应用程序的主类,它是'AppMain.vb'文件中的类名。

如果我不发送参数,我可以毫无问题地执行此操作,稍后可以在$ App对象上执行'ShowDialog()'来调出表单,但如果我没有超过New-Object行尝试发送参数。

  

要清楚我的问题是当我尝试在Powershell中调用类时,我应该如何向VB.NET应用程序中的构造函数(New)方法发送参数?

1 个答案:

答案 0 :(得分:1)

用于实例化对象的语法可能不正确。我知道有两种方法可以做到这一点。

由于您正在使用android:icon cmdlet,我们将首先分析该帮助:

New-Object

New-Object [-TypeName] <String> [[-ArgumentList] <Object[]>]参数是必需的,类型为TypeName。这会以某种方式传递给反射库(显然 - 它是动态的)。第二个是System.String参数。 ArgumentList符号表示它是可选的。使用该参数时,接受一组值。 PowerShell中的数组可以通过多种方式键入,但最简单的方法是提供逗号分隔的列表,如下所示:

[[] ]

因此,您的代码应该写成:

# ArgumentNullException has a pretty straight forward parameter list.
# It takes a param name, then an exception message. This is for demo only.
$paramName = "type"
$message  = "The type name provided could not be resolved."
New-Object -TypeName System.ArgumentNullException -ArgumentList $paramName, $message

另一种方法是直接调用构造函数。这只是在PowerShell中使用.NET方法的调用约定。您始终可以使用$App = New-Object App.AppMain "Test", "01/01/2017", "1001", "1234" 方法调用(公共)构造函数,如果它们是类型上的静态方法。 PowerShell为构造函数公开了这个。你可以这样做(大约):

new

只要您的VB.NET类是公共类,正确加载(可测试),并且构造函数例程是公共的(在您的示例中),我提供的示例应该可以正常工作