【问题标题】:Program crashes by "out string"程序因“输出字符串”而崩溃
【发布时间】:2012-05-10 20:55:33
【问题描述】:

我正在使用这个 dll,其中一种方法期望字符串作为 out 的参数,即

void function(out string param);

当我通过 out 传递字符串时,程序崩溃。我正在使用 C#。 我在 VS2010 的输出调试窗口中得到的输出如下: 程序“[4116] Managed (v4.0.30319)”已退出,代码为 -1073741819 (0xc0000005)。

这个问题突然而短暂,所以我不知道如何进一步解释,但如果您还有其他问题,请告诉我......

更新: 这是 ActiveX dll,我在教程中提到 COM 返回 Unicode 字符串。这是导致问题的原因吗?

【问题讨论】:

  • 您有可用的 C 代码或 DLLImport 声明吗?
  • 0xc0000005 是访问冲突。通常,您会使用已知大小的StringBuilder 作为本机函数的输出缓冲区,而不是string。所以你有C代码?这将帮助我们为您解答。
  • 对不起,我无法理解“你有 C 代码吗?”。我从公司得到的是我通过解决方案资源管理器中的引用链接的实际 dll,我有他们的演示代码和他们的文档。他们的演示代码使用了 Visual C++ 6.0,我认为他们正在使用 MFC。
  • 另外,当我使用他们的 dll 时,我必须将 Embed Interop 类型设置为 false,这样我才能真正使用类及其方法。

标签: c#


【解决方案1】:

如何调试:

这似乎是本机/托管互操作的问题。因此,请确保您的 VS 调试器设置为 x86 的混合(本机/托管)或 x64 的纯本机。

关闭“仅我的代码”(选项->调试)并在引发本机异常时打开调试->异常->。

这样你就会有堆栈,看看发生了什么。

注意:拥有 C 和 C# 部分的源代码可以避免需要调试...

【讨论】:

    【解决方案2】:

    你怎么称呼它,你的方法调用中是否包含“out”字样?

    string str;
    function(out str);
    

    【讨论】:

      【解决方案3】:

      我同意上面的 Ed S。尝试使用 StringBuilder,因为您在托管代码和非托管代码之间传递参数。不幸的是,由于您没有本机代码,因此您不会对其进行过多的调试。

      【讨论】:

      • 我创建了StringBuilder,将其转换为字符串并将其作为out传递但同样的错误
      • 我试图用一个 C# 应用程序与一个 C++ 应用程序对话来重现这个问题,但我无法让它以同样的方式崩溃。对于那个很抱歉。我希望我能帮助你更多。
      猜你喜欢
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多