【问题标题】:Working application launched from C# fails从 C# 启动的工作应用程序失败
【发布时间】:2019-06-14 05:51:09
【问题描述】:

我有 C# 应用程序作为调度程序。它成功运行各种应用程序。其中一个应用程序 (VB6) 在作业中途失败。如果我直接使用完全相同的参数执行这个 VB6 应用程序,它就会成功完成。调度程序成功运行其他 VB6 应用程序。有人知道是什么原因造成的吗?当您从另一个应用程序 (C#) 中启动一个应用程序 (VB6 exe) 时,环境会发生什么变化?也许有专家可以指点我帮助解决这个问题?

我正在向 VB6 应用程序添加更多日志记录,当前错误指向执行 SQL 命令的例程,但我有其他应用程序执行相同的代码没有问题。在这个阶段,我被难住了。

【问题讨论】:

  • 嘿 5ilverFox,你能分享一些代码给我们吗?会很棒:)
  • 公平地说,您的应用程序不是 C#。 C# 是源语言,但它被编译为 IL 字节码,该字节码在运行时被编译为本机代码 - 运行与任何其他进程相同的可执行代码。这里的任何问题要么归结为用户上下文(也许该应用程序在计划任务的用户上下文下无法正常工作)或环境变量(大多数情况下第一个问题的变体)。考虑不同运行案例之间的环境有何不同。
  • 肯定会成为用户上下文。尝试使用 sysinternals 中的 procmon 监控“c#”进程的用户 ID,以查看用户上下文。
  • 尝试editing 发布代码

标签: c# vb6


【解决方案1】:

以下可能不同

  • 用户帐户/用户权限
  • 工作目录
  • 环境变量

我建议使用 Process Explorer 检查 VB6 应用程序并与工作版本进行比较。

【讨论】:

  • 谢谢托马斯。我现在已经证明(使用日志)当执行 sql 代码时会发生问题。 sql 代码有语法错误,sql 代码由用户提供。问题是代码被包裹在“On error resume next”和“On error goto 0”之间,以防止它失败,但它仍然失败。直接运行它不会失败。在这两种情况下,代码都在同一台机器和同一用户上运行。谢谢你的提示。我将使用 Process Explorer 来尝试确定差异。这需要一段时间......
  • @5ilverFox: On Error Resume Next 是 VB6 提出的最糟糕的想法之一。仍然很有趣为什么它一次失败而在另一种情况下没有。
  • 我想验证 SQL 代码对他们来说工作量太大了。 Process Explorer 什么也没透露。我尝试将 On Error 捕获移至不同级别,即移至调用函数,这肯定会阻止失败。所以与 On Error 被调用的次数和不同的子程序相互影响有一定的关系。
  • 我有函数 A 调用函数 B 调用函数 C 调用函数 B。他们在 B 和 C 中有 On Error 语句,在他们“关闭”C 中的 On Error 语句之前,调用 B 是它自己的关于错误语句。我没有编写代码,但看起来我必须重写部分代码以减少 On Error 语句的数量。为什么从 C# 调用时它不起作用,我不知道。调用堆栈中可能存在一些限制。
  • @5ilverFox:如果c#真的把应用程序作为自己的进程运行,VB6会得到自己的调用栈。
【解决方案2】:

好的,我发现了问题。我首先回滚了两个版本的 VB6 代码,并证明它有效。然后我添加了一小部分新代码,并每次检查它是否仍然有效。我没有添加所有代码(有些只是装饰性的),它现在正在使用新功能。这花了很多时间,而且要确定导致原始错误的原因还需要更多时间,所以我决定获胜,因为我负担不起更多的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 2018-12-24
    • 2012-12-15
    • 2013-11-13
    • 2017-10-07
    • 2015-07-17
    • 2017-05-12
    • 2019-02-02
    相关资源
    最近更新 更多