Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C++;在C#应用程序中,C++;堆叠是否正确展开? 是否可以调用C语言应用程序中的C++调用抛出C函数,这样C++堆栈就可以正常解锁了?有这方面的文件吗 例如,请考虑这个C代码: 和C++代码: void CppFunc(void (*handler)) { SomeResourceWrappingClass releasesResourceOnDestruction(); handler(); }_C#_C++_.net_Exception Handling_Interop - Fatal编程技术网

如何从C++;在C#应用程序中,C++;堆叠是否正确展开? 是否可以调用C语言应用程序中的C++调用抛出C函数,这样C++堆栈就可以正常解锁了?有这方面的文件吗 例如,请考虑这个C代码: 和C++代码: void CppFunc(void (*handler)) { SomeResourceWrappingClass releasesResourceOnDestruction(); handler(); }

如何从C++;在C#应用程序中,C++;堆叠是否正确展开? 是否可以调用C语言应用程序中的C++调用抛出C函数,这样C++堆栈就可以正常解锁了?有这方面的文件吗 例如,请考虑这个C代码: 和C++代码: void CppFunc(void (*handler)) { SomeResourceWrappingClass releasesResourceOnDestruction(); handler(); },c#,c++,.net,exception-handling,interop,C#,C++,.net,Exception Handling,Interop,我尝试了这个方法,成功捕获了C#异常,但ReleaseSourceOnDestruction没有调用它的析构函数。这似乎表明C++堆栈没有被正确解开——有可能让它在这里适当地解开吗?有关于这种行为的文件吗 语境:我想有时从C++代码中触发C++异常,这样我就不需要C++中的每个调用都必须检查一些东西,看看是否需要抛出C异常。 尝试在C++项目中启用结构化异常处理。(ProjkProjks:C+C++)>代码生成->启用C++异常> >“是的,具有SEH异常(/EHA))没有SEH异常,返回到C+

我尝试了这个方法,成功捕获了C#异常,但ReleaseSourceOnDestruction没有调用它的析构函数。这似乎表明C++堆栈没有被正确解开——有可能让它在这里适当地解开吗?有关于这种行为的文件吗


语境:我想有时从C++代码中触发C++异常,这样我就不需要C++中的每个调用都必须检查一些东西,看看是否需要抛出C异常。

尝试在C++项目中启用结构化异常处理。(ProjkProjks:C+C++)>代码生成->启用C++异常> >“是的,具有SEH异常(/EHA))没有SEH异常,返回到C++层的异常没有足够的信息来正确地释放堆栈。

您如何知道“代码>析出资源RealExoRebug < /代码>的析构函数没有被引发?您将不得不禁用C++编译器在没有看到C++异常时使用的优化。HOWN.Projt+Projices,C/C++,代码生成,启用C++异常= /EHA。实际上,除了使用关键字之外,还需要使用非标准的“YEXTIG/YOY”。您可以做的非常少,所有需要诊断异常的信息都丢失了。这将是一个从使用中得到的支持电话。这是非常难回答的。402:我给RealSeSeReCon销毁的构造函数和析构函数添加了一个打印语句。构造函数打印但析构函数从不做。C++异常下有多种选项。“是的,有SEH异常(/EHA)”。需要选择。Velox,你看到这种方法有潜在的问题吗?另一个答案表明如果没有被捕获,奇怪的事情就会发生。在您对答案的评论中。我发现这种方法存在以下问题:1-您必须使用catch子句来捕获异常,否则您的程序将因未处理的异常而崩溃。2-由于抛出的是C#异常,您将无法捕获准确的异常。您可能需要
catch(…)
捕捉异常。Velox,谢谢,我对捕捉到的异常感到惊讶(…)实际上确实捕获了C#异常。这实际上不是我想要的,但我想这是有意义的,并且没有解决办法。以下是对/EHa的含义以及此答案工作的原因的很好的解释:。它还解释了EHa是如何危险的,因为使用此设置catch(…)接受不应该捕获的异常,如访问冲突和堆栈溢出。
void CppFunc(void (*handler))
{
   SomeResourceWrappingClass releasesResourceOnDestruction();
   handler();
}