【问题标题】:Difference between Process.Start and manually running exeProcess.Start和手动运行exe的区别
【发布时间】:2013-04-30 08:38:50
【问题描述】:

大局:我编写了一个 Autodesk 发明者插件。在 Inventor 的关闭事件中,它会启动另一个程序,我将调用 purgeworkspace.exe。 purgeworkspace.exe 等到 Inventor 关闭,然后删除 Inventor 正在使用的文件。

这里是调用 purgeworkspace.exe 的相关插件代码。

//Run as admin
if (System.Environment.OSVersion.Version.Major >= 6)
{
    Process p = Process.Start(Properties.Settings.Default.exePath);
    p.StartInfo.Verb = "runas";
}

如果从插件启动 purgeworkspace.exe,我会收到一个 IOException,说明文件正在使用中。但是,如果我通过双击 exe 手动运行 purgeworkspace.exe,它每次都能完美运行。我相信这是由于权限,但我不知道是什么。如您所见,我已经尝试以管理员身份运行我的 exe,但这并没有解决问题。

purgeworkspace.exe 完全按照我手动启动时的预期工作。如何以编程方式调用它以使其运行方式相同?

编辑: 下面是一些代码来演示 purgeworkspace 如何等待发明者。请记住,此代码在我手动启动和从 Inventor 插件运行时都会运行。

static void Main()
{
   while (IsProcessOpen("Inventor"))
   {
       System.Threading.Thread.Sleep(50);
   }
}

private static bool IsProcessOpen(string name)
{
   return Process.GetProcesses().Any(clsProcess => clsProcess.ProcessName.Contains(name));
}

【问题讨论】:

  • 验证进程当前目录是它应该是什么,或者它没有被使用。
  • 您有“以管理员身份运行”作为评论,但我看不到提升发生在哪里。这是 .Verb 应该做的吗?你那里也有用户名和密码吗?
  • @Darkwater23 我假设这里的最佳答案可以做到。有可能我错了。 stackoverflow.com/questions/2532769/…
  • 在这里勉强出去,但我认为它的意思是文件仍在使用中。这意味着您是否是管理员都没有关系。可能值得弄清楚为什么它认为它们仍在使用。
  • @Servy 我不确定我是否遵循。我已经在检查发明者是否已关闭。如果 Inventor 仍在使用这些文件,我的程序在我手动运行时也无法运行。

标签: c# permissions autodesk


【解决方案1】:

无论采取了何种预防措施,仍有一些东西在锁定您的文件。也许具有打开文件句柄的进程没有命名为“Inventor”?

您可以使用this question 来解决这个问题。

【讨论】:

  • 根据 Process Explorer,handle.exe 的 GUI 版本,没有使用我要删除的文件。我理解你的推理,但我相信问题不仅仅是一个正在使用的文件。
  • 事实证明你没有错。我从 Inventor 启动的 exe 是从我试图删除的文件夹中运行的(因为那是发明者的工作目录)。因此,我的 exe 是它试图删除的正在使用的文件。它没有显示在 Process Explorer 中,因为我只想在发明者关闭时检查哪些文件正在使用,而不是在我的程序运行时检查。
  • @Brandon 很高兴你知道了!
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多