1

当应用程序调用使用Double.MaxValue. 在调试器和发布版本中运行都是如此,并且在 32 位 XP 和 64 位 Win 7 下都会发生。

如果在调试器中我在调用方法的行上有一个断点 using Double.MaxValue,则任何执行该方法的尝试(F11、F10、F5)都会停止应用程序并显示友好的 Windows 消息,它已导致问题并需要终止。

将 Double.MaxValue 替换为 9999999999(这对我们的应用程序来说是可以的)使问题消失。看看 IL,从字面上看,所有变化都是常数。

C# 类通过具有本机和托管部分的小型 C++ 混合模式桥从本机代码调用。我们的第一个想法是本机部分可能已经破坏了托管内存区域 - 但是在将 MaxValue 替换为 9999999999 后,应用程序运行良好,并且愉快地在本机部分和托管部分之间来回跳转。

我们不喜欢向客户提供试错软件,并且很想听听关于可能发生什么的任何想法?

- 编辑 -

这是仍然崩溃的桥的最精简版本:

#include <stdio.h>
#include <tchar.h>
#include <vcclr.h>

// -------------------------------------------------------------
//  Managed
// -------------------------------------------------------------

#pragma managed

using namespace System;
using namespace OurCompany::Tools;

// ACtion Move text window
__int32 AktionTextfensterMove (__int32 i32HNCTeil, __int32 i32Ansicht, void* pvoid)
{
   return GUEManagedWrapper::TextfensterVerschieben (i32HNCTeil, i32Ansicht, nullptr);
}

// -------------------------------------------------------------
//  Native
// -------------------------------------------------------------

#pragma unmanaged

#define DLLExport __declspec(dllexport)

extern "C" 
{
// Action Move text window
DLLExport __int32 GUENMBridgeTextfensterMove (__int32 i32HNCTeil, __int32 i32Ansicht,         void* pvoid)
{
  return AktionTextfensterMove (i32HNCTeil, i32Ansicht, pvoid);

} }

---编辑2---

...这是 C# 代码:

public static class GUEManagedWrapper
{
  public static Int32 TextfensterVerschieben (Int32 i32HNCTeil, Int32 i32Ansicht, FizzBuzz fzzBzz)
  {
     fzzBzz= new FizzBuzz();
     fzzBzz.fd  = Double.MaxValue;
     return 0;
  }
}

public class FizzBuzz
{
    public Double fd;
}

这崩溃了;替换Double.MaxValue为 9999999999 可修复崩溃。

4

1 回答 1

0

I had the same problem. Visual Express 2010 c#

double afunction() {
   Console.WriteLine("afunction called");
   if (condition) { return somedoublevalue; }
   ....
   if (condition) { return double.maxValue; }
   return 0;
} 

crashed with a StackOverFlow, whenever afunction() was called (before the Console message). replacing double.maxValue by any double literal solved the problem

于 2014-10-15T05:32:03.637 回答