「不思議な」振る舞いが私のコードで見つかりました。簡単に言えば、ポイントは
- ブレークポイントで機能する行は、ブレークポイントなしでは機能しません
- 特権とは何の関係もありません(「Win32Exception」に関する多くの質問とは異なります)
やや類似した症状がここで報告されました:MSBuildスクリプトは「Win32Exception:システムは指定されたファイルを見つけることができません」を取得します ...両方ともデバッグプロセスと関係があります。(ただし、それが私の問題と関係があるかどうかはわかりません。)
私はにコードを書いています
- テキスト形式でヒストグラムを作成する
- 「System.Diagnostics.Process.Start」を使用して「gnuplot」を起動し、生成されたヒストグラムをプロットします
- 'Process.Start( "generatedPlot.png")も使用して、gnuplotによって生成された画像ファイルを開きます。
作業ディレクトリにpng画像を取得したため、1,2は正常に実行されたようです。
しかし、プロット画像が存在するにもかかわらず、でファイルを開こうとすると、「指定されたファイルが見つかりませんでした」という「Win32Exception」が発生します。
void GeneratePlot()
{
// generate a png image called 'outputPath' with console 'gnuplot.exe'
MyClass.gnuplot(dataFilePath,outputPath);
MyClass.OpenFile(outputPath);
}
OpenFileは単純に次のように定義されます
static void OpenFile(string fileToOpen)
{
Process.Start(fileToOpen); // this throws 'Win32Exception' ...(*)
}
不思議なことがここにあります:この問題をデバッグするために、私は(*)にブレークポイントを置きます。その後、例外はスローされなくなります。
(注:プロットイメージは正常に作成されるため、同じ'fileToOpen'を使用して2回目の実行で例外が発生することはありません。したがって、デバッグする前に、生成されたプロットイメージを必ず削除してください。)
もちろん、そこにブレークポイントを配置する以外の方法を見つけることができました。私がしたことは、MyClass.gnuplotとMyClass.OpenFileの実行を分離することでした。
void GeneratePlot()
{
// some code
MyClass.gnuplot(dataFilePath, outputPath);
}
void button1_Click(object sender, EventArgs e)
{
MyClass.OpenFile(outputPath);
}
'GeneratePlot()'を実行した後、'button1'を押します。 今回はpng画像を表示します!
念のため、次のようなコードを記述してpngプロット画像を作成します:(単独でも問題なく動作します!)
static void gnuplot(string dataFilePath, string outputPath)
{
Process p = new Process();
p.StartInfo.FileName = \\path\\to\\gnuplot.exe;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.WorkingDirectory = Directory.GetWorkingDirectory();
// some other StartInfo setting
p.Start();
// execute gnuplot with the following
StreamWriter sw = new StreamWriter(p.StandardInput);
sw.WriteLine("set terminal \"png\"");
sw.WriteLine("set output " + outputPath);
sw.WriteLine("plot '{0}'",dataFilePath);
}
なぜこれが起こるのか興味があります。アドバイスをいただけますか?事前にどうもありがとうございました。