【问题标题】:C# code won't launch programs. Win32Exception was unhandledC# 代码不会启动程序。 Win32Exception 未处理
【发布时间】:2019-07-06 22:37:25
【问题描述】:

我正在制作一个在单击按钮时启动程序的程序。它似乎适用于 Chrome 或 Word 等程序,但不适用于 fraps 等较小的程序,并给我错误

System.dll 中出现“System.ComponentModel.Win32Exception”类型的未处理异常附加信息:系统找不到指定的文件

private void Fraps_Click(object sender, EventArgs e)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "fraps.exe";
    Process.Start(startInfo);
}

【问题讨论】:

  • 异常的实际信息是什么?我敢打赌这与“我不知道 'fraps.exe' 在哪里”有关。
  • 抛出的异常是什么 :) ??可以放在这里吗
  • 是异常“系统找不到指定的文件”??
  • 似乎找不到文件,这里是完整消息:System.dll 中发生“System.ComponentModel.Win32Exception”类型的未处理异常附加信息:系统找不到指定的文件跨度>
  • 你的项目debug目录下没有fraps.exe应用

标签: c# process


【解决方案1】:

Windows 不知道“fraps.exe”是什么,并且在它被告知要搜索的文件夹中找不到这样的可执行文件。

让我们验证一下。打开命令提示符并输入“fraps.exe”。当前目录的位置无关紧要;主文件夹应该做得很好。

只要您还没有将 fraps 安装到您的主文件夹,这就是您应该看到的。现在,为什么这适用于“chrome.exe”(大概不是我的系统上的情况)而不是fraps?

在幕后,Windows 被告知在您键入命令时查看多个文件夹。如果您在提示中输入SET,然后搜索PATH,则可以看到完整列表。

这有点乱,但这是 Windows 将在 在当前目录中查找您想要的程序的地方。

在这种情况下,Windows 无法在当前目录(您的 bin\Debug 文件夹)或 PATH 中的任何文件夹中找到“fraps.exe”。所以它举起手说The system cannot find the file specified

您有两种选择来解决此问题:

一:使用全路径名。如果你知道fraps的安装位置,可以改用可执行文件的全路径名,如:

startInfo.FileName = @"c:\Program Files\Fraps\fraps.exe";

二:将fraps安装文件夹添加到PATH环境变量中。这更加棘手和复杂,但是您或多或少地将安装到的路径附加到 PATH 变量中。您可以执行此操作,也可以依赖最终用户执行此操作(尽管对我来说这听起来不是一个好主意)。

这两个选项都要求您知道 fraps 的安装位置,因此最好硬编码该值(如果此程序仅供您自己使用)或在启动时询问用户安装路径/安装程序。

【讨论】:

  • 感谢您的解释,它清除了一些东西,完整路径完美运行。
【解决方案2】:

引用MSDN:

在开始该过程之前,您必须至少设置 FileName 属性。文件名是任何应用程序或文档。文档被定义为具有与其关联的打开或默认操作的任何文件类型。您可以使用操作系统提供的“文件夹选项”对话框来查看已注册的文件类型及其计算机相关应用程序。高级按钮指向一个对话框,显示是否存在与特定注册文件类型关联的打开操作。

在您的情况下,fraps.exe 不是已注册的文件类型关联应用程序。所以给 FULL PATH 给 fraps.exe

代码示例如下(在你的硬盘上找到fraps安装并在第二行替换fraps.exe的路径)

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"C:\Program Files\fraps\fraps.exe"; // Your absolute PATH 
Process.Start(startInfo);

【讨论】:

  • 啊,我知道这行得通,但是有没有办法让 fraps.exe 位于不同的目录中,它会检测到它的位置,所以如果它安装在其他地方,应用程序仍然可以工作吗?
  • 我猜你需要设置 PATH :)
  • 这与注册文件类型无关,与不在PATH环境变量/当前目录中有关;您可能应该相应地更新答案。
【解决方案3】:

如果您要调用的 exe 是 32 位的,那么您的代码也必须是 32 位的。 AnyCpu 或 64 位会出现该错误。

【讨论】:

  • 这对我有帮助。
  • 是的...使应用平台(x86,x64)匹配。
【解决方案4】:

Process.Start() 遇到了同样的问题。我有一个 EXE,其解决方案平台针对“任何 CPU”。
我的应用安装在运行 EXCEL(也是 64 位)的 64 位 CPU 上。

解决方案是针对 x64 构建。 (A.Kadir Bener 避开了这一点)

更改Solution Platform 右键单击Solution Explorer中的解决方案...向下滚动到Configuration Manager...
Active solution platform: 下选择 x64(如果有选项)
如果 x64 不是一个选项,则选择 New...
Type or select the new platform...下选择 x64

【讨论】:

    【解决方案5】:

    恕我直言,您可以调用任何在环境中具有路径条目的程序。在这里,我们不确定exe是否存在于正在执行的应用程序的bin目录中。您是否可以尝试使用完整路径,您不会遇到异常

    我建议您可以将 exe 作为应用程序的一部分进行引导,因为它不是 Windows 的一部分,或者您可以提示用户确保路径位于环境变量中。

    【讨论】:

    • 抱歉,我对 Visual Studio 不太擅长,如何将 exe 引导到我的代码中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多