我有一个.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)方法发送参数?
答案 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类是公共类,正确加载(可测试),并且构造函数例程是公共的(在您的示例中),我提供的示例应该可以正常工作