当应用程序调用使用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 可修复崩溃。