Home > Net >  Random number generator not working after converting to Exe
Random number generator not working after converting to Exe

Time:08-16

I have written a dice roller script. I have one with a single die and one with two dice. they both work in powershell, and the single die version works after converting to .exe using ps2exe. but the two die version runs as an exe but I get the following error "You cannot call a method on a null-valued expression" Below is the 2 die script that gives the error after converting.

<# 
.NAME
    Random Dice Roller
#>

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Display1 = 1,2,3,4,5,6 | Get-Random
$Display2 = 1,2,3,4,5,6 | Get-Random
$LabelImage = [system.drawing.image]::FromFile("f:\psscripts\Die1.png")

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = New-Object System.Drawing.Point(400,300)
$Form.text                       = "Roll The Dice"
$Form.TopMost                    = $false
$Form.location                   = New-Object System.Drawing.Point(1,1)
$Form.StartPosition              = "CenterScreen"

$Die1                             = New-Object system.Windows.Forms.Label
$Die1.Text                        = "$Display1"
$Die1.AutoSize                    = $false
$Die1.width                       = 200
$Die1.height                      = 200
$Die1.location                    = New-Object System.Drawing.Point(1,1)
$Die1.Font                        = New-Object System.Drawing.Font('Microsoft Sans Serif',150,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))
$Die1.ForeColor                   = [System.Drawing.ColorTranslator]::FromHtml("#000000")
$Die1.BackgroundImage = $LabelImage

$Die2                             = New-Object system.Windows.Forms.Label
$Die2.Text                        = "$Display2"
$Die2.AutoSize                    = $false
$Die2.width                       = 200
$Die2.height                      = 200
$Die2.location                    = New-Object System.Drawing.Point(200,1)
$Die2.Font                        = New-Object System.Drawing.Font('Microsoft Sans Serif',150,[System.Drawing.FontStyle]([System.Drawing.FontStyle]::Bold))
$Die2.ForeColor                   = [System.Drawing.ColorTranslator]::FromHtml("#000000")
$Die2.BackgroundImage = $LabelImage

$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Size(175,220)
$Button1.Size = New-Object System.Drawing.Size(80,50)
$Button1.Text = "Roll Me"
$Button1.Add_Click({Roll})

$Form.controls.AddRange(@($Die1,$Die2,$Button1))

$Die.Add_Click({ Roll })

#region Logic 
function Roll{
    $Form.Close()
    $Form.Dispose()
    .\Dice.exe}

#endregion

[void]$Form.ShowDialog()

CodePudding user response:

There are two possible causes here:

  1. Note that there is no safety in wrapping you PowerShell script in an .exe file. In fact the PowerShell script is extracted in a temporary folder and executed from there which might be the cause of your issue (e.g. the relative .\Dice.exe location)

  2. It is unwise to do a $Form.Dispose() from within a form function/event
    Remove that from the function and put it outside the form, e.g.:

[void]$Form.ShowDialog(); $Form.Dispose()

(Or do not use the Dispose method at all as PowerShell will usually already take care of that.)

CodePudding user response:

What is your motive for creating an EXE?

An alternative might be to create a CMD file with a Batch bootstrap instead. Create a CMD file with the following code and include your script after this.

<# :
@ECHO OFF
    SET f0=%~f0
    PowerShell -NoProfile -ExecutionPolicy RemoteSigned -Command ".([scriptblock]::Create((get-content -raw $Env:f0)))"
    PAUSE
GOTO :EOF
<#~#>
# Insert PowerShell script after this line.
  • Related