2016-07-30 5 views
0

この問題が発生し、多くの欲求不満を抱えてこれを分離しました。 exeファイルを別のフォルダからドラッグすると、コマンドライン引数を何も持たないビットマップ宣言が "System.ArgumentException:Parameter is not valid"例外をスローします。奇妙な状況下でビットマップ宣言で例外がスローされる

とき、これは発生しません:

  1. ファイルはここにexeファイル

のショートカットをドラッグした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

    関連する問題