2016-07-30 102 views
0

我遇到了這個問題,並通過很多挫折將它隔離到這。 當我從另一個文件夾拖動我的exe文件時,與命令行參數無關的位圖聲明將引發異常「System.ArgumentException:參數無效」。奇怪的情況下拋出位圖聲明的異常

  1. 該文件是從同一個文件夾拖到爲EXE
  2. 該文件被一拖再拖的exe

這裏的快捷方式是最小碼:

時,這不會發生產生此錯誤:

Public Class Form1 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Try 
      Dim logo As New Bitmap("logo.png") 'an image in the same dir as exe 
      Me.BackgroundImage = logo 
     Catch ex As Exception 
      MessageBox.Show("Exception: " & ex.Message) 
     End Try 
    End Sub 
End Class 
+0

除非該文件是可執行文件的本地文件,否則必須提供該文件的完整路徑。 – LarsTech

+0

@LarsTech是的,它是本地的。編輯以使其更清楚。 – user3344445

回答

0

如果您只提供文件名,則假定該文件駐留在當前目錄中。當前目錄在啓動時並不總是相同的,並且它也可以在應用程序運行時更改。

我猜這個文件和EXE在同一個文件夾中。在這種情況下,當代碼工作時,當前目錄必須是應用程序文件夾,並且在失敗的情況下,當前目錄必須是其他文件夾。

當使用Process.Start運行遊戲時,我們經常會看到類似的問題。許多遊戲都會像現在這樣做,並假定當前目錄是應用程序文件夾。如果你從命令行或類似的地方運行遊戲,那麼它會是。如果您使用Process.Start從代碼運行遊戲,則新進程將實際繼承應用程序的當前目錄,並且該類代碼將失敗。

解決方案總是明確指出文件的路徑。如果你想打開一個文件,該文件是在您的應用程序文件夾,然後指定正是:

Dim logo As New Bitmap(IO.Path.Combine(Application.StartupPath, "logo.png")) 

代碼不依賴於當前目錄是一個特定的文件夾,以便將不會受到影響,如果事實並非如此。

+0

謝謝。你的代碼片段解決了這個問題。但無論我將文件從哪裏拖出,「Application.StartupPath」都是一樣的。 – user3344445

+0

當然'Application.StartupPath'每次都是一樣的。這就是整個問題。這是當前目錄改變並使用'Application.StartupPath'意味着當前目錄是不相關的。現在,如果我的回答已經解決了問題,那麼請接受它 – jmcilhinney

+0

@jmcilhinney儘管有這個請求,但這非常嚴格。 – LarsTech