调用非托管DLL时,vshost32.exe崩溃

4
我正在使用一个VS 2005应用程序来与一个非托管的(Fortran)DLL进行接口。当我直接从命令行运行编译后的可执行文件时,一切正常 - 可以访问DLL,并且可以使用DLL中的函数。
不幸的是,当我从VS 2005启动应用程序时,弹出窗口显示“vshost32.exe已停止工作”,并没有有用的调试信息。
有人遇到过这种情况吗,或者知道为什么会发生这种情况?我无法弄清楚为什么在独立启动时可以正常运行,但通过vshost32却不能。
(最后一点说明:我正在使用.local文件强制使用当前工作目录下注册的dll,但这个特定的dll没有注册。我只是在这里提一下,以防有所帮助。)
非常感谢,
Mike

很遗憾,我已经尝试了一切,从修改调用约定到编写C包装器来包装Fortran代码,但都没有成功。希望你能好运,如果你有任何结果,请在下面留下答案!谢谢 :) - Mike
我也遇到了同样的问题。你找到任何解决方案或变通方法了吗? - Alex
5个回答

22

我曾经遇到vshost32.exe崩溃的问题,当我勾选以下复选框后问题消失了:

属性 -> 调试 -> 启用非托管代码调试

这对你有用吗?

编辑: 在较新的版本中,该选项称为:启用本机代码调试(感谢Qwerty01)。

编辑: 它还似乎有助于VS2008 (@Deacon Frost),VS2010 (@Alxandr)。


这解决了我的vshost32.exe崩溃问题。 - Dave
这个提示很好,它捕获了一些未经管理的Fortran代码中的错误,这些错误导致我的程序崩溃。 - Greg
我一整天都在与这个问题斗争。谢谢! - Eric Johnson

1

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

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。仍然感到困惑!谢谢你的帮助。 - Mike
假设在您有机会更改工作文件夹之前,外部dll已经被解析。我找不到任何关于此解析发生的文档,但可能是在程序集即时编译时发生的。 - Dirk Vollmar
1
好吧,真正奇怪的是我可以调用非托管 DLL 中的“一些”函数,但不是所有函数。哎! - Mike
也许你在运行时的路径上有不同版本的dll?或者你的dll中的某些函数动态加载了其他库,而这些库在运行时不在你的路径上。 - Dirk Vollmar
不错的建议。我进行了一些试错操作,决定将该程序在 Visual Studio 之外运行。虽然无法调试应用程序的特定部分,但生活还要继续。再次感谢! - Mike

1

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


1

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


令人惊讶的是,没有任何影响 - 仍然以相同的方式崩溃。您知道这个设置具体有什么影响吗?我认为vshost仍在使用,但<appname>.vshost.exe没有使用。 - Mike
1
感谢您的帮助 - 仍然崩溃,但我很感激调试方面的帮助! - Mike

0

谢谢您的建议!不幸的是,由于它可以从命令行正常运行,我可以排除依赖性问题 - 只是使用.vshost.可执行文件时出了点问题。 叹气 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接