是否可以从 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++ 异常 -> “Yes with SEH Exceptions (/EHa)”)。没有 SEH 异常,返回到 C++ 层的异常没有足够的信息来正确展开堆栈。
关于c# - 如何在 C# 应用程序中从 C++ 调用抛出 C# 函数,以便正确展开 C++ 堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25752545/