我正在尝试从 .NET 3.51 启动一个应用程序(操作系统、我的应用程序和我要启动的应用程序都是 32 位)。
启动进程的代码用于其他应用程序,但有一个让我们头疼。如果我们“双击”应用程序的图标,它会按预期工作,这意味着它可以作为计算机中的应用程序正常工作。直接双击.exe,也可以。
操作系统为 Windows 7 32Bits(家庭版和/或专业版)。
我们的 .NET 应用程序使用 x86 编译以避免出现问题。
启动“进程”的代码位于我们制作的 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;
}
我不知道这个方法是谁写的,但它已经在不同的应用程序上工作了大约六年,因此我认为它“没问题”。但是,我们有一个客户的软件在通过该参数时不会启动。
论据是:
- process是一个 System.Diagnostics.Process 使用简单的“new Process();”创建的</li>
- path是 .exe “c:/path/to/my.exe” 的完整路径。
- enableRaisingEvents为假
- windowStyle已最大化(但已尝试其他)。
它给出了一个糟糕的消息框……我很高兴地把它永生了。它是西班牙语,但翻译应该很容易:
它说:
应用程序错误 程序 (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 添加文件 -> 应用程序清单添加的应用程序清单。
在其中,我确保我们有这个:
<requestedExecutionLevel level=“asInvoker” uiAccess=“false” />
我们不需要管理员或类似的东西,但显然 Vista/7 需要知道它。
添加之后,该过程将正确启动。
注意:默认情况下 UseShellExecute 为true(如某些人所建议的那样),如果这是您想要的,您必须明确将其设置为 false。