![](/img/trans.png)
[英]How to call a C++ delegated function from C#, when C++ call C# functions?
[英]How to call a throwing C# function from C++ in a C# app such that the C++ stack is unwound properly?
是否可以从C#应用程序中的C ++调用调用一个抛出C#函数,以便C ++堆栈正确解开? 有没有这方面的文件?
例如,请考虑这个C#代码:
using System;
public class Test
{
public static void CalledFromCpp()
{
throw new Exception("Is this safe? Is C++ stack unwound properly?");
}
public static void Main()
{
try {
CppFunc(CalledFromCpp);
}
catch(Exception e)
{
Console.Writeline("Exception e: {0}", e);
}
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void CsFuncToBeCalledFromCpp();
[DllImport("CppApp", CallingConvention = CallingConvention.Cdecl)]
private static extern void
CppFunc(CsFuncToBeCalledFromCpp callback);
}
与此C ++代码一起:
void CppFunc(void (*handler))
{
SomeResourceWrappingClass releasesResourceOnDestruction();
handler();
}
我试了一下,C#异常被成功捕获,但releasesResourceOnDestruction没有调用它的析构函数。 这似乎表明C ++堆栈没有正确解开 - 是否有可能在这里正确解开? 有关于此行为的任何文档吗?
对于上下文:如果可能的话,我希望有时会从C ++代码中触发C#异常,这样我就不需要从C#到C ++的每次调用都需要事后检查一下,看看是否需要抛出C#异常。
尝试在C ++项目中启用结构化异常处理(项目属性 - > C / C ++ - >代码生成 - >启用C ++异常 - >“是和SEH异常(/ EHa)”)。 如果没有SEH异常,返回到C ++层的异常没有足够的信息来正确展开堆栈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.