4

新しい WPF アプリケーションを開発しましたが、外部の C# スクリプトから起動するのに苦労しました。

とsuccess の両方で初期化されたオブジェクトをProcess.Start(ProcessStartInfo)使用してメソッドを呼び出すと、プロパティの initのみが起動に失敗します。ProcessStartInfoWorkingDirectoryFileNameFileName

これは、他のアプリケーションを呼び出す場合には当てはまりません。
私の質問 - プロセスを開始する別のアプローチには、別のロジックがありますか?

詳細については、コードを参照してください。

 public void LaunchApp(){
/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfoCalc1 = new ProcessStartInfo
    {
        FileName = @"C:\Windows\system32\calc.exe",
    };

Process.Start(pStartInfoCalc1);

/*****************************/
/*  !!!This code FAILS  !!! */
/*****************************/
var pStartInfo1 = new ProcessStartInfo
    {
        FileName = @"C:\Program Files\MyAppFolder\MyApp.exe",
    };

Process.Start(pStartInfo1);

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfo2 = new ProcessStartInfo
    {
        WorkingDirectory = @"C:\Program Files\MyAppFolder",
        FileName = @"MyApp.exe",
    };

Process.Start(pStartInfo2);

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfoCalc2 = new ProcessStartInfo
    {
        WorkingDirectory = @"C:\Windows\system32\",
        FileName = @"calc.exe",
    };

Process.Start(pStartInfoCalc2); }`

これはクラッシュ時の画像です。 ここに画像の説明を入力

以下は、クラッシュのスクリーンショットからの問題の署名です。

 Problem signature:
  Problem Event Name:   CLR20r3
  Problem Signature 01: MyApp.exe
  Problem Signature 02: 1.0.0.0
  Problem Signature 03: 51ef9fd8
  Problem Signature 04: mscorlib
  Problem Signature 05: 4.0.30319.18052
  Problem Signature 06: 5173bf28
  Problem Signature 07: 266d
  Problem Signature 08: a4
  Problem Signature 09: System.Windows.Markup.XamlParse
  OS Version:   6.1.7601.2.1.0.256.4
  Locale ID:    1033
  Additional Information 1: 1989
  Additional Information 2: 1989c043e2e04efdbf18835c58bb867b
  Additional Information 3: 37d3
  Additional Information 4: 37d31c18f56cf3083b1c45ca83bbb78e

Read our privacy statement online:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
  C:\Windows\system32\en-US\erofflps.txt
4

2 に答える 2

7

作業ディレクトリを指定しない場合、新しいプロセスはプロセスの作業ディレクトリを継承します。つまり、新しいプロセスは、 を呼び出したプロセスの作業ディレクトリを継承しますProcess.Start()

start の 2 つの試みの違いはこれだけMyAppです。そのうちの 1 つは作業ディレクトリを継承し、そのうちの 1 つは作業ディレクトリを指定します。MyApp親プロセスのディレクトリを初期作業ディレクトリとして実行するのは明らかに好きではありません。

なぜそうなのか、はっきりとは言えません。MyAppが起動時に XML 解析を試みているようです。そのため、おそらくその XML 解析は、作業ディレクトリにあると推定されるファイルを読み取ります。しかし実際には、ファイルは実行可能ファイルと同じディレクトリにあります。

その場合はMyApp、問題を解決するために変更する必要があります。この XML ファイルの相対パスを使用する代わりに、実行可能ファイルのディレクトリに基づいて絶対パスを作成する必要があります。

MyApp起動コードは、次のようにそのディレクトリに配置できます。

string ExeDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.
    GetExecutingAssembly().Location));

次にPath.Combine、XML ファイルへのフル パスを作成するために使用します。

于 2013-07-25T11:57:51.283 に答える
5

作業ディレクトリを指定しない場合、現在のアプリケーションのディレクトリが使用されます。

などのアプリケーションにcalcは外部ファイルの依存関係がないため、どこから起動されたかは気にしません。作業ディレクトリからファイルを読み取る必要はありません。

ほとんどMyApp.exeの場合、独自の作業ディレクトリ、おそらく構成ファイルからのデータが必要です。調べることを知っているため、このテストはパスしますC:\Program Files\MyAppFolder

/********************************/
/*      This code PASSES        */
/********************************/
var pStartInfo2 = new ProcessStartInfo
{
    WorkingDirectory = @"C:\Program Files\MyAppFolder",
    FileName = @"MyApp.exe",
};

Process.Start(pStartInfo2);

作業ディレクトリを指定しないと、起動中のアプリのディレクトリで必要なリソースを見つけようとしているため、必要なリソースを読み込めないため、アプリがクラッシュしました。

アプリケーションを起動するときに作業ディレクトリがわかっている場合は、それを提供することをお勧めします。

MyApp.exe独自の場所を特定するために使用できる を更新できる場合はSystem.Reflection.Assembly.GetExecutingAssembly().Location、これに関連するファイル パスを読み取ることができるため、作業ディレクトリを設定する必要がなくなります。

于 2013-07-25T11:58:38.453 に答える