在Windows 7下启动System.Diagnostics.Process时出现问题

Mar*_*ini 5 .net c# system.diagnostics windows-7

我正在尝试从.NET 3.51启动一个应用程序(操作系统,我的应用程序和我要启动的应用程序都是32位).

启动Process的代码用于其他应用程序,但是有一个令我们头疼的问题.如果我们在应用程序的图标上"双击"它,它会按预期工作,这意味着它可以作为计算机中的应用程序正常工作.直接双击.exe也可以.

操作系统是Windows 7 32位(家庭和/或专业).

我们的.NET应用程序使用x86编译以避免出现问题.

启动"Processes"的代码位于我们制作的DLL(也是32位)内,基本上它是一个简单的DLL,它包含一些"通用代码",我们在整个代码中使用的常用方法,函数和内容.其中一种方法如下所示:

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;
    }
Run Code Online (Sandbox Code Playgroud)

我不知道是谁编写了这种方法,但它已经使用不同的应用程序工作了大约六年,因此我认为它是"好的".但是,我们有一个客户使用的软件在通过该参数时无法启动.

论点是:

  1. process是一个使用简单的"new Process();"创建的System.Diagnostics.Process.
  2. path是.exe"c:/path/to/my.exe"的完整路径.
  3. enableRaisingEvents为false
  4. windowStyle最大化(但已尝试过其他人).

它给了一个糟糕的MessageBox ......我很高兴永生.它是西班牙语,但翻译应该很容易:

替代文字

它说:

应用程序错误 程序(0x0eedfade)发生意外异常...

谷歌搜索0x0eedfade给出了看起来可怕的奇怪结果,但事实是,如果我去.exe,我试图启动并双击它,它完美地工作.

对于记录:如果我尝试启动其他东西(即:Notepad.exe,Adobe Acrobat Reader)它可以工作, Firefox不会打开,也不会显示错误.

这种"一些工作,一些没有"的行为让我相信Windows 7安全机制或类似的问题可能存在我不知道的问题.

我错过了什么或做错了什么?

更新:好的; 我已经得到了该软件的副本.这是一个混乱的软件,但它的工作原理.现在我可以调试了,我发现程序在使用my 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:
Run Code Online (Sandbox Code Playgroud)

替代文字

这意味着,"该程序无法启动,因为ddip.dll丢失...尝试重新安装bla bla".

问题是,如果我从命令行执行相同的@path,程序将完美打开:

替代文字

这打开了程序.如果我点击它位于"程序"菜单中的"快捷方式",也会发生同样的情况.该快捷方式中没有任何参数,只是对可执行文件的简单调用.

所以现在的问题是:我的代码与其他方法有什么区别?

必须有不同的东西导致我的过程无法启动.

有任何想法吗?

更新和解决方案

我通过使用以下提供的答案之一使其工作.事实证明,没有人直接指出我的解决方案,但他们都给了我很好的想法.

我在我们的应用程序中添加了一个应用程序清单(自从vista时代以来应该已经拥有它,不知道它为什么不在第一个位置).我使用VStudio 2008添加的应用程序清单添加文件 - >应用程序清单.

在其中,我确保我们有这个:

<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
Run Code Online (Sandbox Code Playgroud)

我们不需要管理员或类似的东西,但显然Vista/7需要知道它.

之后添加,该过程正确启动.

注意:默认情况下UseShellExecute为true(如某些人所建议的那样),如果这是你想要的,你必须明确地将它变为false.

Han*_*ant 8

您没有设置process.StartInfo.WorkingDirectory属性.有很多写得不好的软件,假设工作目录将是存储EXE的目录.至少添加这一行:

 process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(@path);
Run Code Online (Sandbox Code Playgroud)

然而,例外是相当奇怪的.我绝对建议您告诉客户更新他们的反恶意软件工具.


Kat*_*ory 5

如果exe有清单,则在调用Start之前,应在进程对象上将UseShellExecute设置为true.无论如何,这不是一个坏主意.