【问题标题】:vshost32.exe crash when calling unmanaged DLL调用非托管 DLL 时 vshost32.exe 崩溃
【发布时间】:2010-10-18 15:34:35
【问题描述】:

我正在使用 VS 2005 应用程序与非托管 (Fortran) DLL 进行交互。当我直接从命令行运行编译后的可执行文件时,一切都很好——可以访问 DLL,并且可以使用 DLL 中的函数。

不幸的是,当我从 VS 2005 启动应用程序时,我收到一个弹出窗口,指出“vshost32.exe 已停止工作”并且没有有用的调试信息。

有没有人经历过这种行为,或者知道为什么会发生这种情况?我不明白为什么它在独立启动时运行良好,但不是通过 vshost32。

(最后一点:我正在使用 .local 文件强制从 cwd 使用已注册的 dll,但这个特定的 dll 未注册。我只是在此处注明,以防万一。)


非常感谢,

迈克

【问题讨论】:

  • 你有想过这个吗?我有同样的问题:(
  • 很遗憾,没有。我已经尝试了从修改调用约定到围绕 Fortran 编写 C 包装器,然后包装它的所有方法! Sigh 祝你好运,如果你得到任何结果,请在下面留下答案!谢谢 :)
  • 我也遇到了同样的问题。您是否找到任何解决方案或解决方法?

标签: dll visual-studio-2005 unmanaged vshost32


【解决方案1】:

我遇到了 vshost32.exe 崩溃的问题,当我选中复选框时问题消失了:

Properties -> Debug -> Enable unmanaged code debugging

它对你有用吗?

编辑:在最近的版本中,该选项被称为:Enable native code debugging(感谢 Qwerty01)

编辑:它似乎在 VS2008 (@Deacon Frost)、VS2010 (@Alxandr) 中也有帮助。

【讨论】:

  • 这解决了我的 vshost32.exe 崩溃问题。
  • 这在导致我的程序崩溃的一些非托管 fortran 代码中发现了一个错误。很好的提示。
  • 我整天都在和这个作斗争。谢谢!
【解决方案2】:

不确定,但您可以从“属性”->“调试”中禁用 Visual Studio 托管进程

【讨论】:

  • 令人惊讶的是,没有效果 - 仍然以同样的方式崩溃。你知道这个设置有什么确切的效果吗?我认为仍然使用vshost,但没有使用.vshost.exe。
  • 感谢您的帮助 - 仍然崩溃,但我感谢调试帮助!
【解决方案3】:

可能存在未处理的异常。您可以尝试添加以下代码来处理所有未捕获的异常:

static void Main()
{
  // Add a handler for the UnhandledExceptionEvent
  AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  Application.Run(new Form1());
}

static void CurrentDomain_UnhandledException
     (object sender, UnhandledExceptionEventArgs e)
{
    try
    {
        Exception ex = (Exception)e.ExceptionObject;

        MessageBox.Show(ex.ToString(), "Error", 
              MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }
    finally
    {
        Application.Exit();  
    }
}

根本问题的原因是您在调试时可能有不同的工作文件夹,因此找不到您的本机库。

【讨论】:

  • 不幸的是,没有捕获到未处理的异常。此外,我在调用非托管 dll 之前在代码中显式设置 cwd。还是一脸懵逼!感谢您的帮助。
  • 假设在您有机会更改工作文件夹之前,外部 dll 已经被解析。当此解决方案发生时,我找不到任何文档,但可能是在程序集被 jitted 时?
  • 嗯,真正奇怪的是我可以调用非托管 DLL 中的 一些 函数,而不是全部。呃!
  • 也许您在运行时路径上有不同版本的 dll?或者您的 dll 中的某些函数会动态加载其他库,这些库在运行时不在您的路径上
  • 不错的建议。我做了一堆反复试验的东西,我决定我只是要在 Visual Studio 之外运行该死的东西。我无法调试这个特定的应用程序,但生活还在继续。再次感谢!
【解决方案4】:

我正在使用 Visual C# 2010 Express。我能够通过导航到 Project -> Properties 来阻止 vshost32 崩溃。我单击了“调试”选项卡并取消选中“启用 Visual Studio 托管进程”复选框。

【讨论】:

    【解决方案5】:

    下载依赖walker http://www.dependencywalker.com/ 用它来打开你的 dll,看看它是否依赖于该文件夹中不存在的其他 dll。

    【讨论】:

    • 感谢您的建议!不幸的是,由于它从命令行运行良好,我可以排除依赖问题 - 使用 .vshost 只是一些问题。在某处搞砸的可执行文件。 叹息
    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2011-10-28
    • 2019-02-15
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2010-11-02
    • 2021-07-27
    相关资源
    最近更新 更多