C# 是否可以禁用c++;从.net应用程序断言

C# 是否可以禁用c++;从.net应用程序断言,c#,c++,C#,C++,我有以下问题: 我使用我的WPF应用程序的C++库,在一些非常罕见的情况下,该库抛出了一个断言。它显示了一个与C++文件名、行数和断言表达式的良好对话框。所以问题是:假设我没有源代码,我能在C++库中禁用断言吗?我真正需要的是“捕获”这个断言并记录它 谢谢。根据您的汇编技能以及是否有意采取措施阻止此类内容,通常可以修改二进制代码以防止显示此类消息 然而,断言触发通常是一些更壮观的崩溃或其他错误行为的前兆,因此仅仅停止消息框可能不会让您走得更远。当然,有些断言是错误的,所以这可能就是您所需要的 如

我有以下问题: 我使用我的WPF应用程序的C++库,在一些非常罕见的情况下,该库抛出了一个断言。它显示了一个与C++文件名、行数和断言表达式的良好对话框。所以问题是:假设我没有源代码,我能在C++库中禁用断言吗?我真正需要的是“捕获”这个断言并记录它


谢谢。

根据您的汇编技能以及是否有意采取措施阻止此类内容,通常可以修改二进制代码以防止显示此类消息

然而,断言触发通常是一些更壮观的崩溃或其他错误行为的前兆,因此仅仅停止消息框可能不会让您走得更远。当然,有些断言是错误的,所以这可能就是您所需要的


如果我必须修改这个DLL,我会和IDA一起反汇编它,并制作一个补丁。隐藏断言可能相当容易,记录断言要困难得多。

一种方法是创建一个线程,每隔一段时间执行
EnumWindows
,并检测断言窗口是否弹出,然后它可以捕获消息并单击忽略按钮。这仍然会导致窗口显示一小段时间(取决于
EnumWindows
之间的间隔),但我假设您的客户不会获得调试DLL,所以这不重要


另一个选项是调用以禁用全部显示断言。
如果你想从.NET中PInvoke这个,请注意,
\u CRT\u ASSERT
等于2。

我最近不得不修复一些依赖于DLL的旧代码,该DLL有时会弹出一条ASSERT消息。我尝试了上述所有建议,唯一可行的方法是单击“忽略”按钮。上面的用户建议运行EnumWindows在另一个线程上-我使用FindWindow代替

此函数用于查找断言弹出消息,在其中查找忽略按钮,然后单击它。它将进入一个循环,每次检查一个全局变量(丑陋但快速):

断言框的标题可能不同。如果忽略按钮的引用方式不同,则可以使用EnumChildWindows获取每个子控件(包括按钮)的名称

在弹出断言的代码位之前,我启动一个调用上述函数的新线程

finishThread = 0; //this is set to 1 when the thread should finish
_beginthread (CloseAssertBox, 0, NULL); //begin the thread
通过危险的易断言代码后,我设置:

finishThread = 1; //done threaded stuff
这样,线程将在下次循环结束时关闭。可能有更好的方法

我必须包含这些库才能使其正常工作:

#include <process.h> //for multithreading
#include <WinBase.h> //for Sleep function
int finishThread; //to tell the thread when encoding has finished
#包含//用于多线程
#包含//用于睡眠功能
int finishThread;//在编码完成时告诉线程

这一切都是在Visual Studio 2010中使用2006年的库完成的。

这是触发断言还是引发异常?这是一个断言。异常不是问题。问题是dll是由另一个团队开发的,它在发布模式下断言:)这就是为什么我在寻找任何方法来阻止它。@Alex,我添加了另一个选项,我认为它更适合你的需要。莫蒂,谢谢你的想法。我试了一下,它不起作用。我猜断言是由断言宏引起的,但您的解决方案使用的是_assertone。assert宏似乎只是弹出一个对话框,其中包含断言消息:(
#include <process.h> //for multithreading
#include <WinBase.h> //for Sleep function
int finishThread; //to tell the thread when encoding has finished