2

私のアプリケーションでは、ユーザーがログインした後、いくつかの画像ボックス/ボタンなどの画像を設定し、それらにいくつかのスケーリングを行います。たとえば、相対パスを使用します。

@".\Images\SomeImage.png"

アプリケーションを直接起動すると正常に動作しますが、別のアプリケーションを介して実行しようとすると、次のようになります。

Process process = new Process();
process.StartInfo.FileName = networkPath;
process.Start();

画像が見つからないため、ファイルが見つからないというエラーが発生します。コマンドプロンプトから起動しようとすると、これも実行されます。実行可能ファイルはネットワークドライブに保存されます。この状況で相対パスが機能しないのはなぜですか?先に進んでフルパスをハードコーディングすることはできますが、それは私を汚く感じさせます...何か考えはありますか?

4

2 に答える 2

3

Process.WorkingDirectoryプロパティを正しいパスに設定する必要があります。

投稿したパス:

@".\Images\SomeImage.png"

ネットワークパスではありません(UNCまたはマップされたドライブを使用していません)。

于 2011-07-15T15:27:21.973 に答える
3

これは、作業ディレクトリが異なるためです。デフォルトでは、新しいプロセスを開始すると、新しいプロセスの作業ディレクトリが既存のプロセスの作業ディレクトリに設定されます(これは、おそらく既存のアプリケーションが含まれるディレクトリになります)。

通常、アプリケーションは、実行可能ファイルが含まれるディレクトリとして作業ディレクトリを使用して実行されます。これは、たとえば、新しいショートカットを作成するときのデフォルトです(これは、[開始]フィールドのショートカットプロパティで確認できます。

ただし、アプリケーションをコマンドプロンプトまたは別のアプリケーションから実行すると、作業ディレクトリが変更され、相対パスが完全に異なるディレクトリに解決されます。

呼び出し元のアプリケーションを変更してWorkingDirectory、新しいプロセスのプロパティを期待する値に設定することもできますが、これを修正してアプリケーションを変更し、実行可能ファイルへのパスに基づいて絶対パスを使用するようにする適切な方法があります。 Assembly.GetExecutingAssembly().Location実行中の実行可能ファイルへのパスを取得するために使用できるため、次のコードでうまくいくはずです。

static string GetAbsolutePathFromRelative(string RelativePath)
{
    string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string absolutePath = Path.Combine(directory, RelativePath);
    // This final call is to stop paths like "C:\Dir\..\OtherDir\file.txt" being returned
    return Path.GetFullPath(absolutePath);
}   
于 2011-07-15T15:28:34.060 に答える