如何在C#应用程序中调用C++中的C#函数,以便C++堆栈正确解开?

JDi*_*teo 5 .net c# c++ interop exception-handling

是否可以从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);
}
Run Code Online (Sandbox Code Playgroud)

与此C++代码一起:

void CppFunc(void (*handler))
{
   SomeResourceWrappingClass releasesResourceOnDestruction();
   handler();
}
Run Code Online (Sandbox Code Playgroud)

我试了一下,C#异常被成功捕获,但releasesResourceOnDestruction没有调用它的析构函数.这似乎表明C++堆栈没有正确解开 - 是否有可能在这里正确展开?有关于此行为的任何文档吗?

对于上下文:如果可能的话,我希望有时会从C++代码中触发C#异常,这样我就不需要从C#到C++的每次调用都需要事后检查一下,看看是否需要抛出C#异常.

Vel*_*lox 2

尝试在 C++ 项目中启用结构化异常处理(项目属性 -> C/C++ -> 代码生成 -> 启用 C++ 异常 -> “是,使用 SEH 异常 (/EHa)”)。如果没有 SEH 异常,则返回到 C++ 层的异常没有足够的信息来正确展开堆栈。