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)
我不知道是谁编写了这种方法,但它已经使用不同的应用程序工作了大约六年,因此我认为它是"好的".但是,我们有一个客户使用的软件在通过该参数时无法启动.
论点是:
它给了一个糟糕的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.
您没有设置process.StartInfo.WorkingDirectory属性.有很多写得不好的软件,假设工作目录将是存储EXE的目录.至少添加这一行:
process.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(@path);
Run Code Online (Sandbox Code Playgroud)
然而,例外是相当奇怪的.我绝对建议您告诉客户更新他们的反恶意软件工具.
| 归档时间: |
|
| 查看次数: |
8470 次 |
| 最近记录: |