2017-07-13 52 views
0

我有一個.NET EXE文件,有兩個'新'方法;一種新方法接受四個參數,另一個不接受任何參數。「新的」方法「無法找到過載...」 - Powershell reflection.assembly實例化一個VB.NET類

最終目標是能夠通過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 

我從一個引用編譯EXE Powershell腳本在時刻測試這個,並且似乎在這樣做時遇到了麻煩。

當我嘗試將這些參數傳遞給該類時,出現一條錯誤消息,指出使用該參數的數量不會超載。

我的PowerShell腳本:

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

在上面的例子中,「APP.EXE」是我編譯EXE的完整的文件路徑,並「應用」是埋入式的項目名稱。 'AppMain'是應用程序的主要類,它是'AppMain.vb'文件中的類名。

如果我不發送參數,並且稍後可以在$ App對象上執行'ShowDialog()'來調出窗體,但不要過去New-Object行,我嘗試發送參數。

要清楚我的問題是我應該如何發送參數構造函數(新建)方法在我的VB.NET應用程序,當我嘗試調用在PowerShell中的類?

回答

1

用於實例化對象的語法可能不正確。我知道有兩種方法可以做到這一點。

因爲你使用的New-Object cmdlet的,我們將分析的幫助,首先:需要

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 

因此,你的代碼可能應該寫成:

$App = New-Object App.AppMain "Test", "01/01/2017", "1001", "1234" 

另一種方法是直接調用構造函數。這只是在PowerShell中使用.NET方法的調用約定。如果使用new方法,您可以始終調用(公共)構造函數as-if他們是一種類型的靜態方法。 PowerShell公開了這個構造函數。你可以做到這一點(約),像這樣:

$App = [App.AppMain]::new("Test", "01/01/2017", "1001", "1234") 

只要你的VB.NET類是一個公共類,正確加載(這是可測試),並構造程序是公開的(其它在你的例子中),我提供的例子都應該工作。

+0

最後,我意識到我正在重命名正在生成的已編譯的EXE之前,在同一個文件夾中調用過時的EXE文件....但您的回答非常好。謝謝! – schizoid04

+0

優秀!這確實是嘗試將自定義代碼加載到PowerShell的挑戰,以及IDE真正能夠幫助解決的問題。 – PSGuy

相關問題