2

私には奇妙な問題があります(私にとって)。

Windowsフォームアプリケーション「firstapp.exe」というアプリケーションがあります。Windowsフォームアプリケーションである別のアプリケーション「launcher.exe」もあります。また、「server.exe」という名前のコンソール アプリケーションがあります。

firstapp と launcher はどちらも同じディレクトリにあります。そのディレクトリには、他のファイルを含む「Config」フォルダーもあります。

firstapp の config フォルダーから 1 つのファイルを読み取るために使用するコード:

StreamReader reader = new StreamReader("Config\\launcher.txt");
string readed_config = reader.ReadToEnd();
reader.Close();

ランチャー (process.start を使用) で firstapp アプリケーションを実行すると、すべてうまくいきます。firstappと同じディレクトリにないコンソールアプリケーションで実行すると、コードのその部分から「ディレクトリが見つからないという例外」が発生します(上記に投稿)。

どうすれば問題を解決できますか? コンソール アプリケーションが、独立して実行する必要がある別のアプリケーションに独自のパスを追加するのはなぜですか?

4

4 に答える 4

2
 StreamReader reader = new StreamReader("Config\\launcher.txt");

コード内でハードコーディングされた相対ファイル パスを使用しないでください。それは Environment.CurrentDirectory に決定的に依存しており、それはあまりにも予測不可能です。あなたが見つけたように、外部コードはあなたを殺すことができます。内部コードも OpenFileDialog を使用すると、コードがクラッシュします。Assembly.GetEntryAssembly().Location と Path クラスを使用して、いつでもフル パスを取得できます。

var exedir = Path.GetDirectory(Assembly.GetEntryAssembly().Location);
var path = Path.Combine(exedir, @"Config\launcher.txt");
using (var reader = new StreamReader(path)) {
    //...
}

今では常に機能します。

于 2013-07-29T17:49:52.560 に答える
1

これは、パスが相対的であり、コンソール アプリが winform を開始したときに現在の作業ディレクトリが異なるためです。また、ストリーム リーダーをusingステートメントでラップする必要があります。現状では、コードの他の場所で明示的に呼び出さない限り、Dispose()解放する必要があるリソースを保持しています。

問題を解決するWorkingDirectoryには、プロセスを開始するときに を変更するかProcess.StartInfo.WorkingDirectory、コード内のパスを変更して相対パスにならないようにします。または、別のオプションとして、パスをアプリケーションに渡すか、リソース ファイルから読み取って、実行時に適切なパスを指定できるようにすることもできます。

于 2013-07-29T17:38:18.230 に答える