如何从C++;在C#应用程序中,C++;堆叠是否正确展开? 是否可以调用C语言应用程序中的C++调用抛出C函数,这样C++堆栈就可以正常解锁了?有这方面的文件吗 例如,请考虑这个C代码: 和C++代码: void CppFunc(void (*handler)) { SomeResourceWrappingClass releasesResourceOnDestruction(); handler(); }
我尝试了这个方法,成功捕获了C#异常,但ReleaseSourceOnDestruction没有调用它的析构函数。这似乎表明C++堆栈没有被正确解开——有可能让它在这里适当地解开吗?有关于这种行为的文件吗如何从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++代码中触发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();
}