.NET 3.51 からアプリケーション (オペレーティング システム、マイ アプリケーション、および起動するアプリケーションはすべて 32 ビット) を起動しようとしています。
プロセスを起動するコードは他のアプリケーションにも使用されますが、頭を悩ませているものがあります。アプリケーションのアイコンを「ダブルクリック」すると、期待どおりに動作します。つまり、コンピュータ内のアプリケーションとして正常に動作します。.exe を直接ダブルクリックしても機能します。
オペレーティング システムは Windows 7 32 ビット (Home および/または Professional) です。
問題を回避するために、.NET アプリケーションは x86 でコンパイルされています。
「プロセス」を起動するコードは、私たちが作成した DLL (これも 32 ビット) 内にあります。基本的には、コード全体で使用する一般的なメソッド、関数、および全体にわたっていくつかの「共通コード」を保持する単純な DLL です。これらのメソッドの 1 つが次のようになります。
public static bool FireUpProcess( Process process, string path, bool enableRaisingEvents,
ProcessWindowStyle windowStyle, string arguments )
{
if ( process != null )
{
try
{
process.StartInfo.FileName = @path;
if ( arguments != null )
{
if ( arguments != String.Empty )
{
process.StartInfo.Arguments = arguments;
}
}
process.StartInfo.WindowStyle = windowStyle;
process.EnableRaisingEvents = enableRaisingEvents;
process.Start();
}
catch
{
try
{
process.Kill();
}
catch ( InvalidOperationException )
{
} // The process is not even created
return false;
}
}
else
{
return false;
}
return true;
}
誰がこのメソッドを作成したのかはわかりませんが、さまざまなアプリケーションで約 6 年間動作しているため、「問題ない」と思います。ただし、その議論を通過したときに起動しないソフトウェアを持っている顧客がいます。
引数は次のとおりです。
- プロセスは、単純な「new Process();」で作成された System.Diagnostics.Process です</li>
- pathは、.exe「c:/path/to/my.exe」へのフル パスです。
- enableRaisingEventsが false
- windowStyleは最大化されています(ただし、他のものを試しました)。
それはくだらない MessageBox を与えます…私は喜んでそれを不滅にしました。それはスペイン語ですが、翻訳は簡単なはずです:
それは言います:
アプリケーション エラー プログラム (0x0eedfade) で予期しない例外が発生しました …
0x0eedfade をグーグルで検索すると、恐ろしく見える奇妙な結果が得られますが、実際には、起動しようとしている .exe に移動してダブルクリックすると、完全に機能します。
記録のために : 他のもの (例: Notepad.exe、Adobe Acrobat Reader) を起動しようとすると、動作しますが、 Firefox が開かず、エラーも表示されません。
この「一部は機能し、一部は機能しない」という動作から、Windows 7 のセキュリティ メカニズムまたは同様の、私が知らない問題があるのではないかと考えてしまいます。
私は何が欠けているか、間違っていますか?
更新:わかりました。ソフトウェアのコピーを入手しました。面倒なソフトウェアですが、機能します。デバッグできるようになったので、FireUpProcess
メソッドでプログラムを起動するとエラーが発生することがわかりました。
提案どおり、WorkingDirectory コードを追加しましたが、コードは次のとおりです。
public static bool FireUpProcess(Process process, string path, bool enableRaisingEvents, ProcessWindowStyle windowStyle)
{
if (process != null)
{
try
{
if ( !String.IsNullOrEmpty(@path) )
{
process.StartInfo.FileName = @path;
process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(@path);
process.StartInfo.WindowStyle = windowStyle;
// Suscribe to the exit notification
process.EnableRaisingEvents = enableRaisingEvents;
// Disable to prevent multiple launchs
Framework.Check.LogWarning("LAUNCHING EXTERNAL DEVICE WITH PATH: " + path);
process.Start(); // HERE The program reports the following:
つまり、「ddip.dll が見つからないため、プログラムを開始できませんでした… bla bla を再インストールしてみてください」ということです。
問題は、コマンド ラインから同じ @path を実行すると、プログラムが完全に開くということです。
これにより、プログラムが開きます。「プログラム」メニューにある「ショートカット」をクリックしても同じことが起こります。そのショートカットにはパラメーターはありません。実行可能ファイルへの単純な呼び出しです。
質問は今です:私のコードと他の方法の違いは何ですか?
私のプロセスが開始されない原因は何か違うはずです。
何か案は?
更新と解決策
以下の回答のいずれかを使用して機能させました。解決策を直接教えてくれる人は誰もいなかったことが判明しましたが、彼らは皆、あちこちで良いアイデアをくれました。
アプリケーションにアプリ マニフェストを追加しました( vista の時代からあるはずでしたが、なぜ最初の場所になかったのかわかりません)。VStudio 2008 add file -> app manifest を使用して追加したアプリ マニフェスト。
その中で、これがあることを確認しました:
<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
管理者などは必要ありませんが、明らかに Vista/7 はそれを知る必要があります。
それが追加された後、プロセスは正しく起動されます。
注: UseShellExecute はデフォルトでtrueです(一部の人が示唆しているように)。それが必要な場合は、明示的に false に変更する必要があります。